@quantiya/codevibe-core 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 +178 -0
- package/bin/codevibe.js +7 -0
- package/dist/appsync/appsync-client.d.ts +132 -0
- package/dist/appsync/appsync-client.js +568 -0
- package/dist/appsync/index.d.ts +2 -0
- package/dist/appsync/index.js +10 -0
- package/dist/appsync/queries.d.ts +16 -0
- package/dist/appsync/queries.js +189 -0
- package/dist/auth/auth-cli.d.ts +5 -0
- package/dist/auth/auth-cli.js +217 -0
- package/dist/auth/auth-service.d.ts +53 -0
- package/dist/auth/auth-service.js +310 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +9 -0
- package/dist/config/config.d.ts +53 -0
- package/dist/config/config.js +123 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +8 -0
- package/dist/crypto/crypto-service.d.ts +118 -0
- package/dist/crypto/crypto-service.js +284 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.js +9 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +68 -0
- package/dist/keychain/index.d.ts +1 -0
- package/dist/keychain/index.js +8 -0
- package/dist/keychain/keychain-manager.d.ts +125 -0
- package/dist/keychain/keychain-manager.js +375 -0
- package/dist/logger/index.d.ts +1 -0
- package/dist/logger/index.js +8 -0
- package/dist/logger/logger.d.ts +35 -0
- package/dist/logger/logger.js +142 -0
- package/dist/prompt-parser.d.ts +39 -0
- package/dist/prompt-parser.js +236 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.js +7 -0
- package/dist/session/session-resume.d.ts +55 -0
- package/dist/session/session-resume.js +151 -0
- package/dist/types/auth.d.ts +15 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/encryption.d.ts +54 -0
- package/dist/types/encryption.js +3 -0
- package/dist/types/events.d.ts +74 -0
- package/dist/types/events.js +28 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.js +22 -0
- package/dist/types/session.d.ts +59 -0
- package/dist/types/session.js +22 -0
- package/package.json +51 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { DeviceIdentity, TokenData, EncryptedSessionKey } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Error class for keychain operations
|
|
4
|
+
*/
|
|
5
|
+
export declare class KeychainError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Manages device identity and OAuth tokens using native keychain
|
|
10
|
+
*/
|
|
11
|
+
export declare class KeychainManager {
|
|
12
|
+
private static instance;
|
|
13
|
+
private deviceIdentity;
|
|
14
|
+
private sessionKeyCache;
|
|
15
|
+
private isRegistered;
|
|
16
|
+
private _serviceName;
|
|
17
|
+
private constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Get the keychain service name (lazy-loaded from config)
|
|
20
|
+
*/
|
|
21
|
+
private get serviceName();
|
|
22
|
+
static getInstance(): KeychainManager;
|
|
23
|
+
/**
|
|
24
|
+
* Get the device identity from keychain
|
|
25
|
+
*/
|
|
26
|
+
getDeviceIdentity(): Promise<DeviceIdentity | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Set the device identity in keychain
|
|
29
|
+
*/
|
|
30
|
+
setDeviceIdentity(identity: DeviceIdentity): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Get or create device identity
|
|
33
|
+
*/
|
|
34
|
+
getOrCreateDeviceIdentity(): Promise<DeviceIdentity>;
|
|
35
|
+
/**
|
|
36
|
+
* Get device ID (creates identity if needed)
|
|
37
|
+
*/
|
|
38
|
+
getDeviceId(): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Get device public key (creates identity if needed)
|
|
41
|
+
*/
|
|
42
|
+
getDevicePublicKey(): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Get device private key (creates identity if needed)
|
|
45
|
+
*/
|
|
46
|
+
getDevicePrivateKey(): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if device identity exists
|
|
49
|
+
*/
|
|
50
|
+
hasDeviceIdentity(): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Delete device identity (reset device)
|
|
53
|
+
*/
|
|
54
|
+
deleteDeviceIdentity(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Get token account name for environment
|
|
57
|
+
*/
|
|
58
|
+
private getTokenAccount;
|
|
59
|
+
/**
|
|
60
|
+
* Get OAuth tokens for environment
|
|
61
|
+
*/
|
|
62
|
+
getTokens(environment?: string): Promise<TokenData | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Save OAuth tokens for environment
|
|
65
|
+
*/
|
|
66
|
+
setTokens(tokens: TokenData, environment?: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Delete OAuth tokens for environment
|
|
69
|
+
*/
|
|
70
|
+
deleteTokens(environment?: string): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Check if token is expired
|
|
73
|
+
*/
|
|
74
|
+
isTokenExpired(tokens: TokenData): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Get session key for a session, decrypting from encryptedKeys if needed
|
|
77
|
+
*/
|
|
78
|
+
getSessionKey(sessionId: string, encryptedKeys?: EncryptedSessionKey[]): Promise<string | null>;
|
|
79
|
+
/**
|
|
80
|
+
* Generate and encrypt a new session key for all devices
|
|
81
|
+
*/
|
|
82
|
+
createSessionKey(devicePublicKeys: Array<{
|
|
83
|
+
deviceId: string;
|
|
84
|
+
publicKey: string;
|
|
85
|
+
}>): {
|
|
86
|
+
sessionKey: string;
|
|
87
|
+
encryptedKeys: EncryptedSessionKey[];
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Cache a session key
|
|
91
|
+
*/
|
|
92
|
+
cacheSessionKey(sessionId: string, sessionKey: string): void;
|
|
93
|
+
/**
|
|
94
|
+
* Clear cached session key
|
|
95
|
+
*/
|
|
96
|
+
clearSessionKey(sessionId: string): void;
|
|
97
|
+
/**
|
|
98
|
+
* Clear all cached session keys
|
|
99
|
+
*/
|
|
100
|
+
clearAllSessionKeys(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Get registration status
|
|
103
|
+
*/
|
|
104
|
+
getIsRegistered(): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Set registration status
|
|
107
|
+
*/
|
|
108
|
+
setIsRegistered(registered: boolean): void;
|
|
109
|
+
/**
|
|
110
|
+
* Get device name for registration
|
|
111
|
+
*/
|
|
112
|
+
getDeviceName(): string;
|
|
113
|
+
/**
|
|
114
|
+
* Get platform for registration
|
|
115
|
+
*/
|
|
116
|
+
getDevicePlatform(): string;
|
|
117
|
+
/**
|
|
118
|
+
* Clear all data (device identity + all tokens)
|
|
119
|
+
*/
|
|
120
|
+
clearAllData(): Promise<void>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Export singleton instance
|
|
124
|
+
*/
|
|
125
|
+
export declare const keychainManager: KeychainManager;
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// keychain-manager.ts
|
|
4
|
+
// CodeVibe Core
|
|
5
|
+
//
|
|
6
|
+
// Manages device encryption keys and OAuth tokens using native keychain
|
|
7
|
+
// Uses keytar for cross-platform keychain access:
|
|
8
|
+
// - macOS: Keychain
|
|
9
|
+
// - Linux: libsecret
|
|
10
|
+
// - Windows: Credential Manager
|
|
11
|
+
//
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.keychainManager = exports.KeychainManager = exports.KeychainError = void 0;
|
|
47
|
+
const os = __importStar(require("os"));
|
|
48
|
+
const uuid_1 = require("uuid");
|
|
49
|
+
const keytar = __importStar(require("keytar"));
|
|
50
|
+
const crypto_1 = require("../crypto");
|
|
51
|
+
const config_1 = require("../config");
|
|
52
|
+
const logger_1 = require("../logger");
|
|
53
|
+
/**
|
|
54
|
+
* Error class for keychain operations
|
|
55
|
+
*/
|
|
56
|
+
class KeychainError extends Error {
|
|
57
|
+
constructor(message) {
|
|
58
|
+
super(message);
|
|
59
|
+
this.name = 'KeychainError';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.KeychainError = KeychainError;
|
|
63
|
+
// Keychain account names
|
|
64
|
+
const DEVICE_IDENTITY_ACCOUNT = 'device-identity';
|
|
65
|
+
const TOKEN_ACCOUNT_PREFIX = 'tokens-'; // tokens-development, tokens-production
|
|
66
|
+
/**
|
|
67
|
+
* Manages device identity and OAuth tokens using native keychain
|
|
68
|
+
*/
|
|
69
|
+
class KeychainManager {
|
|
70
|
+
constructor() {
|
|
71
|
+
this.deviceIdentity = null;
|
|
72
|
+
this.sessionKeyCache = new Map();
|
|
73
|
+
this.isRegistered = false;
|
|
74
|
+
this._serviceName = null;
|
|
75
|
+
// Service name is lazy-loaded to avoid calling getConfig() before config is initialized
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the keychain service name (lazy-loaded from config)
|
|
79
|
+
*/
|
|
80
|
+
get serviceName() {
|
|
81
|
+
if (!this._serviceName) {
|
|
82
|
+
this._serviceName = (0, config_1.getConfig)().keychain.serviceName;
|
|
83
|
+
}
|
|
84
|
+
return this._serviceName;
|
|
85
|
+
}
|
|
86
|
+
static getInstance() {
|
|
87
|
+
if (!KeychainManager.instance) {
|
|
88
|
+
KeychainManager.instance = new KeychainManager();
|
|
89
|
+
}
|
|
90
|
+
return KeychainManager.instance;
|
|
91
|
+
}
|
|
92
|
+
// MARK: - Device Identity Management
|
|
93
|
+
/**
|
|
94
|
+
* Get the device identity from keychain
|
|
95
|
+
*/
|
|
96
|
+
async getDeviceIdentity() {
|
|
97
|
+
if (this.deviceIdentity) {
|
|
98
|
+
return this.deviceIdentity;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const data = await keytar.getPassword(this.serviceName, DEVICE_IDENTITY_ACCOUNT);
|
|
102
|
+
if (!data) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
this.deviceIdentity = JSON.parse(data);
|
|
106
|
+
logger_1.logger.info(`[KeychainManager] Loaded device identity: ${this.deviceIdentity.deviceId}`);
|
|
107
|
+
return this.deviceIdentity;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger_1.logger.error(`[KeychainManager] Failed to load device identity: ${error}`);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Set the device identity in keychain
|
|
116
|
+
*/
|
|
117
|
+
async setDeviceIdentity(identity) {
|
|
118
|
+
try {
|
|
119
|
+
await keytar.setPassword(this.serviceName, DEVICE_IDENTITY_ACCOUNT, JSON.stringify(identity));
|
|
120
|
+
this.deviceIdentity = identity;
|
|
121
|
+
logger_1.logger.info(`[KeychainManager] Saved device identity: ${identity.deviceId}`);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger_1.logger.error(`[KeychainManager] Failed to save device identity: ${error}`);
|
|
125
|
+
throw new KeychainError(`Failed to save device identity: ${error}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get or create device identity
|
|
130
|
+
*/
|
|
131
|
+
async getOrCreateDeviceIdentity() {
|
|
132
|
+
let identity = await this.getDeviceIdentity();
|
|
133
|
+
if (identity) {
|
|
134
|
+
return identity;
|
|
135
|
+
}
|
|
136
|
+
// Generate new device identity
|
|
137
|
+
const keyPair = crypto_1.cryptoService.generateKeyPair();
|
|
138
|
+
identity = {
|
|
139
|
+
deviceId: (0, uuid_1.v4)().toUpperCase(),
|
|
140
|
+
privateKey: keyPair.privateKey,
|
|
141
|
+
publicKey: keyPair.publicKey,
|
|
142
|
+
createdAt: new Date().toISOString(),
|
|
143
|
+
};
|
|
144
|
+
await this.setDeviceIdentity(identity);
|
|
145
|
+
logger_1.logger.info(`[KeychainManager] Generated new device identity: ${identity.deviceId}`);
|
|
146
|
+
return identity;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get device ID (creates identity if needed)
|
|
150
|
+
*/
|
|
151
|
+
async getDeviceId() {
|
|
152
|
+
const identity = await this.getOrCreateDeviceIdentity();
|
|
153
|
+
return identity.deviceId;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get device public key (creates identity if needed)
|
|
157
|
+
*/
|
|
158
|
+
async getDevicePublicKey() {
|
|
159
|
+
const identity = await this.getOrCreateDeviceIdentity();
|
|
160
|
+
return identity.publicKey;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get device private key (creates identity if needed)
|
|
164
|
+
*/
|
|
165
|
+
async getDevicePrivateKey() {
|
|
166
|
+
const identity = await this.getOrCreateDeviceIdentity();
|
|
167
|
+
return identity.privateKey;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if device identity exists
|
|
171
|
+
*/
|
|
172
|
+
async hasDeviceIdentity() {
|
|
173
|
+
const identity = await this.getDeviceIdentity();
|
|
174
|
+
return identity !== null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Delete device identity (reset device)
|
|
178
|
+
*/
|
|
179
|
+
async deleteDeviceIdentity() {
|
|
180
|
+
try {
|
|
181
|
+
await keytar.deletePassword(this.serviceName, DEVICE_IDENTITY_ACCOUNT);
|
|
182
|
+
this.deviceIdentity = null;
|
|
183
|
+
this.sessionKeyCache.clear();
|
|
184
|
+
this.isRegistered = false;
|
|
185
|
+
logger_1.logger.info('[KeychainManager] Deleted device identity');
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
logger_1.logger.error(`[KeychainManager] Failed to delete device identity: ${error}`);
|
|
189
|
+
throw new KeychainError(`Failed to delete device identity: ${error}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// MARK: - Token Management
|
|
193
|
+
/**
|
|
194
|
+
* Get token account name for environment
|
|
195
|
+
*/
|
|
196
|
+
getTokenAccount(environment) {
|
|
197
|
+
return `${TOKEN_ACCOUNT_PREFIX}${environment}`;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get OAuth tokens for environment
|
|
201
|
+
*/
|
|
202
|
+
async getTokens(environment = 'production') {
|
|
203
|
+
try {
|
|
204
|
+
const data = await keytar.getPassword(this.serviceName, this.getTokenAccount(environment));
|
|
205
|
+
if (!data) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
const tokens = JSON.parse(data);
|
|
209
|
+
logger_1.logger.debug(`[KeychainManager] Loaded tokens for ${environment}`);
|
|
210
|
+
return tokens;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
logger_1.logger.error(`[KeychainManager] Failed to load tokens: ${error}`);
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Save OAuth tokens for environment
|
|
219
|
+
*/
|
|
220
|
+
async setTokens(tokens, environment = 'production') {
|
|
221
|
+
try {
|
|
222
|
+
await keytar.setPassword(this.serviceName, this.getTokenAccount(environment), JSON.stringify(tokens));
|
|
223
|
+
logger_1.logger.info(`[KeychainManager] Saved tokens for ${environment}`, {
|
|
224
|
+
userId: tokens.userId,
|
|
225
|
+
email: tokens.email,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
logger_1.logger.error(`[KeychainManager] Failed to save tokens: ${error}`);
|
|
230
|
+
throw new KeychainError(`Failed to save tokens: ${error}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Delete OAuth tokens for environment
|
|
235
|
+
*/
|
|
236
|
+
async deleteTokens(environment = 'production') {
|
|
237
|
+
try {
|
|
238
|
+
const deleted = await keytar.deletePassword(this.serviceName, this.getTokenAccount(environment));
|
|
239
|
+
if (deleted) {
|
|
240
|
+
logger_1.logger.info(`[KeychainManager] Deleted tokens for ${environment}`);
|
|
241
|
+
}
|
|
242
|
+
return deleted;
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
logger_1.logger.error(`[KeychainManager] Failed to delete tokens: ${error}`);
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Check if token is expired
|
|
251
|
+
*/
|
|
252
|
+
isTokenExpired(tokens) {
|
|
253
|
+
const bufferMs = 5 * 60 * 1000; // 5 minutes buffer
|
|
254
|
+
return Date.now() >= (tokens.expiresAt - bufferMs);
|
|
255
|
+
}
|
|
256
|
+
// MARK: - Session Key Management
|
|
257
|
+
/**
|
|
258
|
+
* Get session key for a session, decrypting from encryptedKeys if needed
|
|
259
|
+
*/
|
|
260
|
+
async getSessionKey(sessionId, encryptedKeys) {
|
|
261
|
+
// Check cache first
|
|
262
|
+
const cachedKey = this.sessionKeyCache.get(sessionId);
|
|
263
|
+
if (cachedKey) {
|
|
264
|
+
return cachedKey;
|
|
265
|
+
}
|
|
266
|
+
// Try to decrypt from encrypted keys
|
|
267
|
+
if (!encryptedKeys || encryptedKeys.length === 0) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const deviceId = await this.getDeviceId();
|
|
271
|
+
const ourEncryptedKey = encryptedKeys.find((k) => k.deviceId === deviceId);
|
|
272
|
+
if (!ourEncryptedKey) {
|
|
273
|
+
logger_1.logger.warn(`[KeychainManager] Device ${deviceId} not found in encryptedKeys`);
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
// Get our private key
|
|
277
|
+
const privateKey = await this.getDevicePrivateKey();
|
|
278
|
+
// Decrypt session key
|
|
279
|
+
const sessionKey = crypto_1.cryptoService.decryptSessionKey(ourEncryptedKey, privateKey);
|
|
280
|
+
// Cache for future use
|
|
281
|
+
this.sessionKeyCache.set(sessionId, sessionKey);
|
|
282
|
+
logger_1.logger.info(`[KeychainManager] Decrypted and cached session key for ${sessionId}`);
|
|
283
|
+
return sessionKey;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Generate and encrypt a new session key for all devices
|
|
287
|
+
*/
|
|
288
|
+
createSessionKey(devicePublicKeys) {
|
|
289
|
+
// Generate random session key
|
|
290
|
+
const sessionKey = crypto_1.cryptoService.generateSessionKey();
|
|
291
|
+
// Encrypt for each device
|
|
292
|
+
const encryptedKeys = devicePublicKeys.map((device) => {
|
|
293
|
+
const encrypted = crypto_1.cryptoService.encryptSessionKey(sessionKey, device.publicKey);
|
|
294
|
+
return {
|
|
295
|
+
deviceId: device.deviceId,
|
|
296
|
+
encryptedKey: encrypted.encryptedKey,
|
|
297
|
+
ephemeralPublicKey: encrypted.ephemeralPublicKey,
|
|
298
|
+
};
|
|
299
|
+
});
|
|
300
|
+
logger_1.logger.info(`[KeychainManager] Created session key for ${devicePublicKeys.length} devices`);
|
|
301
|
+
return { sessionKey, encryptedKeys };
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Cache a session key
|
|
305
|
+
*/
|
|
306
|
+
cacheSessionKey(sessionId, sessionKey) {
|
|
307
|
+
this.sessionKeyCache.set(sessionId, sessionKey);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Clear cached session key
|
|
311
|
+
*/
|
|
312
|
+
clearSessionKey(sessionId) {
|
|
313
|
+
this.sessionKeyCache.delete(sessionId);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Clear all cached session keys
|
|
317
|
+
*/
|
|
318
|
+
clearAllSessionKeys() {
|
|
319
|
+
this.sessionKeyCache.clear();
|
|
320
|
+
}
|
|
321
|
+
// MARK: - Registration Status
|
|
322
|
+
/**
|
|
323
|
+
* Get registration status
|
|
324
|
+
*/
|
|
325
|
+
getIsRegistered() {
|
|
326
|
+
return this.isRegistered;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Set registration status
|
|
330
|
+
*/
|
|
331
|
+
setIsRegistered(registered) {
|
|
332
|
+
this.isRegistered = registered;
|
|
333
|
+
}
|
|
334
|
+
// MARK: - Device Info
|
|
335
|
+
/**
|
|
336
|
+
* Get device name for registration
|
|
337
|
+
*/
|
|
338
|
+
getDeviceName() {
|
|
339
|
+
return os.hostname() || 'CLI Client';
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Get platform for registration
|
|
343
|
+
*/
|
|
344
|
+
getDevicePlatform() {
|
|
345
|
+
const platform = os.platform();
|
|
346
|
+
if (platform === 'darwin') {
|
|
347
|
+
return 'MACOS';
|
|
348
|
+
}
|
|
349
|
+
else if (platform === 'linux') {
|
|
350
|
+
return 'LINUX';
|
|
351
|
+
}
|
|
352
|
+
else if (platform === 'win32') {
|
|
353
|
+
return 'WINDOWS';
|
|
354
|
+
}
|
|
355
|
+
return 'CLI';
|
|
356
|
+
}
|
|
357
|
+
// MARK: - Full Reset
|
|
358
|
+
/**
|
|
359
|
+
* Clear all data (device identity + all tokens)
|
|
360
|
+
*/
|
|
361
|
+
async clearAllData() {
|
|
362
|
+
await this.deleteDeviceIdentity();
|
|
363
|
+
await this.deleteTokens('development');
|
|
364
|
+
await this.deleteTokens('production');
|
|
365
|
+
this.sessionKeyCache.clear();
|
|
366
|
+
this.isRegistered = false;
|
|
367
|
+
logger_1.logger.info('[KeychainManager] Cleared all data');
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
exports.KeychainManager = KeychainManager;
|
|
371
|
+
/**
|
|
372
|
+
* Export singleton instance
|
|
373
|
+
*/
|
|
374
|
+
exports.keychainManager = KeychainManager.getInstance();
|
|
375
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rZXljaGFpbi9rZXljaGFpbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxFQUFFO0FBQ0Ysc0JBQXNCO0FBQ3RCLGdCQUFnQjtBQUNoQixFQUFFO0FBQ0Ysd0VBQXdFO0FBQ3hFLGtEQUFrRDtBQUNsRCxvQkFBb0I7QUFDcEIscUJBQXFCO0FBQ3JCLGdDQUFnQztBQUNoQyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFRix1Q0FBeUI7QUFDekIsK0JBQW9DO0FBQ3BDLCtDQUFpQztBQUVqQyxzQ0FBMEM7QUFDMUMsc0NBQXNDO0FBQ3RDLHNDQUFtQztBQUVuQzs7R0FFRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFDdEMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUxELHNDQUtDO0FBRUQseUJBQXlCO0FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFDbEQsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsQ0FBQyx3Q0FBd0M7QUFFaEY7O0dBRUc7QUFDSCxNQUFhLGVBQWU7SUFPMUI7UUFMUSxtQkFBYyxHQUEwQixJQUFJLENBQUM7UUFDN0Msb0JBQWUsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNqRCxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFHekMsd0ZBQXdGO0lBQzFGLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksV0FBVztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBQSxrQkFBUyxHQUFFLENBQUMsUUFB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LGlCQUFpQjtRQUNmLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxQixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO2FBQU0sSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQzthQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxxQkFBcUI7SUFFckI7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixlQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBbldELDBDQW1XQztBQUVEOztHQUVHO0FBQ1UsUUFBQSxlQUFlLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIGtleWNoYWluLW1hbmFnZXIudHNcbi8vIENvZGVWaWJlIENvcmVcbi8vXG4vLyBNYW5hZ2VzIGRldmljZSBlbmNyeXB0aW9uIGtleXMgYW5kIE9BdXRoIHRva2VucyB1c2luZyBuYXRpdmUga2V5Y2hhaW5cbi8vIFVzZXMga2V5dGFyIGZvciBjcm9zcy1wbGF0Zm9ybSBrZXljaGFpbiBhY2Nlc3M6XG4vLyAtIG1hY09TOiBLZXljaGFpblxuLy8gLSBMaW51eDogbGlic2VjcmV0XG4vLyAtIFdpbmRvd3M6IENyZWRlbnRpYWwgTWFuYWdlclxuLy9cblxuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgKiBhcyBrZXl0YXIgZnJvbSAna2V5dGFyJztcbmltcG9ydCB7IERldmljZUlkZW50aXR5LCBUb2tlbkRhdGEsIEVuY3J5cHRlZFNlc3Npb25LZXkgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvJztcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuXG4vKipcbiAqIEVycm9yIGNsYXNzIGZvciBrZXljaGFpbiBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXljaGFpbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnS2V5Y2hhaW5FcnJvcic7XG4gIH1cbn1cblxuLy8gS2V5Y2hhaW4gYWNjb3VudCBuYW1lc1xuY29uc3QgREVWSUNFX0lERU5USVRZX0FDQ09VTlQgPSAnZGV2aWNlLWlkZW50aXR5JztcbmNvbnN0IFRPS0VOX0FDQ09VTlRfUFJFRklYID0gJ3Rva2Vucy0nOyAvLyB0b2tlbnMtZGV2ZWxvcG1lbnQsIHRva2Vucy1wcm9kdWN0aW9uXG5cbi8qKlxuICogTWFuYWdlcyBkZXZpY2UgaWRlbnRpdHkgYW5kIE9BdXRoIHRva2VucyB1c2luZyBuYXRpdmUga2V5Y2hhaW5cbiAqL1xuZXhwb3J0IGNsYXNzIEtleWNoYWluTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBLZXljaGFpbk1hbmFnZXI7XG4gIHByaXZhdGUgZGV2aWNlSWRlbnRpdHk6IERldmljZUlkZW50aXR5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2Vzc2lvbktleUNhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGlzUmVnaXN0ZXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zZXJ2aWNlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBTZXJ2aWNlIG5hbWUgaXMgbGF6eS1sb2FkZWQgdG8gYXZvaWQgY2FsbGluZyBnZXRDb25maWcoKSBiZWZvcmUgY29uZmlnIGlzIGluaXRpYWxpemVkXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBrZXljaGFpbiBzZXJ2aWNlIG5hbWUgKGxhenktbG9hZGVkIGZyb20gY29uZmlnKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3NlcnZpY2VOYW1lKSB7XG4gICAgICB0aGlzLl9zZXJ2aWNlTmFtZSA9IGdldENvbmZpZygpLmtleWNoYWluLnNlcnZpY2VOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VydmljZU5hbWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogS2V5Y2hhaW5NYW5hZ2VyIHtcbiAgICBpZiAoIUtleWNoYWluTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgS2V5Y2hhaW5NYW5hZ2VyLmluc3RhbmNlID0gbmV3IEtleWNoYWluTWFuYWdlcigpO1xuICAgIH1cbiAgICByZXR1cm4gS2V5Y2hhaW5NYW5hZ2VyLmluc3RhbmNlO1xuICB9XG5cbiAgLy8gTUFSSzogLSBEZXZpY2UgSWRlbnRpdHkgTWFuYWdlbWVudFxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRldmljZSBpZGVudGl0eSBmcm9tIGtleWNoYWluXG4gICAqL1xuICBhc3luYyBnZXREZXZpY2VJZGVudGl0eSgpOiBQcm9taXNlPERldmljZUlkZW50aXR5IHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmRldmljZUlkZW50aXR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXZpY2VJZGVudGl0eTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGtleXRhci5nZXRQYXNzd29yZCh0aGlzLnNlcnZpY2VOYW1lLCBERVZJQ0VfSURFTlRJVFlfQUNDT1VOVCk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGV2aWNlSWRlbnRpdHkgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgbG9nZ2VyLmluZm8oYFtLZXljaGFpbk1hbmFnZXJdIExvYWRlZCBkZXZpY2UgaWRlbnRpdHk6ICR7dGhpcy5kZXZpY2VJZGVudGl0eSEuZGV2aWNlSWR9YCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXZpY2VJZGVudGl0eTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbS2V5Y2hhaW5NYW5hZ2VyXSBGYWlsZWQgdG8gbG9hZCBkZXZpY2UgaWRlbnRpdHk6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXZpY2UgaWRlbnRpdHkgaW4ga2V5Y2hhaW5cbiAgICovXG4gIGFzeW5jIHNldERldmljZUlkZW50aXR5KGlkZW50aXR5OiBEZXZpY2VJZGVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBrZXl0YXIuc2V0UGFzc3dvcmQoXG4gICAgICAgIHRoaXMuc2VydmljZU5hbWUsXG4gICAgICAgIERFVklDRV9JREVOVElUWV9BQ0NPVU5ULFxuICAgICAgICBKU09OLnN0cmluZ2lmeShpZGVudGl0eSlcbiAgICAgICk7XG4gICAgICB0aGlzLmRldmljZUlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgICBsb2dnZXIuaW5mbyhgW0tleWNoYWluTWFuYWdlcl0gU2F2ZWQgZGV2aWNlIGlkZW50aXR5OiAke2lkZW50aXR5LmRldmljZUlkfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtLZXljaGFpbk1hbmFnZXJdIEZhaWxlZCB0byBzYXZlIGRldmljZSBpZGVudGl0eTogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IG5ldyBLZXljaGFpbkVycm9yKGBGYWlsZWQgdG8gc2F2ZSBkZXZpY2UgaWRlbnRpdHk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBjcmVhdGUgZGV2aWNlIGlkZW50aXR5XG4gICAqL1xuICBhc3luYyBnZXRPckNyZWF0ZURldmljZUlkZW50aXR5KCk6IFByb21pc2U8RGV2aWNlSWRlbnRpdHk+IHtcbiAgICBsZXQgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLmdldERldmljZUlkZW50aXR5KCk7XG4gICAgaWYgKGlkZW50aXR5KSB7XG4gICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgbmV3IGRldmljZSBpZGVudGl0eVxuICAgIGNvbnN0IGtleVBhaXIgPSBjcnlwdG9TZXJ2aWNlLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgIGlkZW50aXR5ID0ge1xuICAgICAgZGV2aWNlSWQ6IHV1aWR2NCgpLnRvVXBwZXJDYXNlKCksXG4gICAgICBwcml2YXRlS2V5OiBrZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICBwdWJsaWNLZXk6IGtleVBhaXIucHVibGljS2V5LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuc2V0RGV2aWNlSWRlbnRpdHkoaWRlbnRpdHkpO1xuICAgIGxvZ2dlci5pbmZvKGBbS2V5Y2hhaW5NYW5hZ2VyXSBHZW5lcmF0ZWQgbmV3IGRldmljZSBpZGVudGl0eTogJHtpZGVudGl0eS5kZXZpY2VJZH1gKTtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRldmljZSBJRCAoY3JlYXRlcyBpZGVudGl0eSBpZiBuZWVkZWQpXG4gICAqL1xuICBhc3luYyBnZXREZXZpY2VJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5nZXRPckNyZWF0ZURldmljZUlkZW50aXR5KCk7XG4gICAgcmV0dXJuIGlkZW50aXR5LmRldmljZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXZpY2UgcHVibGljIGtleSAoY3JlYXRlcyBpZGVudGl0eSBpZiBuZWVkZWQpXG4gICAqL1xuICBhc3luYyBnZXREZXZpY2VQdWJsaWNLZXkoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMuZ2V0T3JDcmVhdGVEZXZpY2VJZGVudGl0eSgpO1xuICAgIHJldHVybiBpZGVudGl0eS5wdWJsaWNLZXk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRldmljZSBwcml2YXRlIGtleSAoY3JlYXRlcyBpZGVudGl0eSBpZiBuZWVkZWQpXG4gICAqL1xuICBhc3luYyBnZXREZXZpY2VQcml2YXRlS2V5KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLmdldE9yQ3JlYXRlRGV2aWNlSWRlbnRpdHkoKTtcbiAgICByZXR1cm4gaWRlbnRpdHkucHJpdmF0ZUtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkZXZpY2UgaWRlbnRpdHkgZXhpc3RzXG4gICAqL1xuICBhc3luYyBoYXNEZXZpY2VJZGVudGl0eSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlSWRlbnRpdHkoKTtcbiAgICByZXR1cm4gaWRlbnRpdHkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGRldmljZSBpZGVudGl0eSAocmVzZXQgZGV2aWNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRGV2aWNlSWRlbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGtleXRhci5kZWxldGVQYXNzd29yZCh0aGlzLnNlcnZpY2VOYW1lLCBERVZJQ0VfSURFTlRJVFlfQUNDT1VOVCk7XG4gICAgICB0aGlzLmRldmljZUlkZW50aXR5ID0gbnVsbDtcbiAgICAgIHRoaXMuc2Vzc2lvbktleUNhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tLZXljaGFpbk1hbmFnZXJdIERlbGV0ZWQgZGV2aWNlIGlkZW50aXR5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgW0tleWNoYWluTWFuYWdlcl0gRmFpbGVkIHRvIGRlbGV0ZSBkZXZpY2UgaWRlbnRpdHk6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBuZXcgS2V5Y2hhaW5FcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBkZXZpY2UgaWRlbnRpdHk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTUFSSzogLSBUb2tlbiBNYW5hZ2VtZW50XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiBhY2NvdW50IG5hbWUgZm9yIGVudmlyb25tZW50XG4gICAqL1xuICBwcml2YXRlIGdldFRva2VuQWNjb3VudChlbnZpcm9ubWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7VE9LRU5fQUNDT1VOVF9QUkVGSVh9JHtlbnZpcm9ubWVudH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBPQXV0aCB0b2tlbnMgZm9yIGVudmlyb25tZW50XG4gICAqL1xuICBhc3luYyBnZXRUb2tlbnMoZW52aXJvbm1lbnQ6IHN0cmluZyA9ICdwcm9kdWN0aW9uJyk6IFByb21pc2U8VG9rZW5EYXRhIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQga2V5dGFyLmdldFBhc3N3b3JkKHRoaXMuc2VydmljZU5hbWUsIHRoaXMuZ2V0VG9rZW5BY2NvdW50KGVudmlyb25tZW50KSk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuczogVG9rZW5EYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0tleWNoYWluTWFuYWdlcl0gTG9hZGVkIHRva2VucyBmb3IgJHtlbnZpcm9ubWVudH1gKTtcbiAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgW0tleWNoYWluTWFuYWdlcl0gRmFpbGVkIHRvIGxvYWQgdG9rZW5zOiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgT0F1dGggdG9rZW5zIGZvciBlbnZpcm9ubWVudFxuICAgKi9cbiAgYXN5bmMgc2V0VG9rZW5zKHRva2VuczogVG9rZW5EYXRhLCBlbnZpcm9ubWVudDogc3RyaW5nID0gJ3Byb2R1Y3Rpb24nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGtleXRhci5zZXRQYXNzd29yZChcbiAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgdGhpcy5nZXRUb2tlbkFjY291bnQoZW52aXJvbm1lbnQpLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0b2tlbnMpXG4gICAgICApO1xuICAgICAgbG9nZ2VyLmluZm8oYFtLZXljaGFpbk1hbmFnZXJdIFNhdmVkIHRva2VucyBmb3IgJHtlbnZpcm9ubWVudH1gLCB7XG4gICAgICAgIHVzZXJJZDogdG9rZW5zLnVzZXJJZCxcbiAgICAgICAgZW1haWw6IHRva2Vucy5lbWFpbCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtLZXljaGFpbk1hbmFnZXJdIEZhaWxlZCB0byBzYXZlIHRva2VuczogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IG5ldyBLZXljaGFpbkVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0b2tlbnM6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBPQXV0aCB0b2tlbnMgZm9yIGVudmlyb25tZW50XG4gICAqL1xuICBhc3luYyBkZWxldGVUb2tlbnMoZW52aXJvbm1lbnQ6IHN0cmluZyA9ICdwcm9kdWN0aW9uJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWxldGVkID0gYXdhaXQga2V5dGFyLmRlbGV0ZVBhc3N3b3JkKHRoaXMuc2VydmljZU5hbWUsIHRoaXMuZ2V0VG9rZW5BY2NvdW50KGVudmlyb25tZW50KSk7XG4gICAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0tleWNoYWluTWFuYWdlcl0gRGVsZXRlZCB0b2tlbnMgZm9yICR7ZW52aXJvbm1lbnR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbS2V5Y2hhaW5NYW5hZ2VyXSBGYWlsZWQgdG8gZGVsZXRlIHRva2VuczogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdG9rZW4gaXMgZXhwaXJlZFxuICAgKi9cbiAgaXNUb2tlbkV4cGlyZWQodG9rZW5zOiBUb2tlbkRhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCBidWZmZXJNcyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcyBidWZmZXJcbiAgICByZXR1cm4gRGF0ZS5ub3coKSA+PSAodG9rZW5zLmV4cGlyZXNBdCAtIGJ1ZmZlck1zKTtcbiAgfVxuXG4gIC8vIE1BUks6IC0gU2Vzc2lvbiBLZXkgTWFuYWdlbWVudFxuXG4gIC8qKlxuICAgKiBHZXQgc2Vzc2lvbiBrZXkgZm9yIGEgc2Vzc2lvbiwgZGVjcnlwdGluZyBmcm9tIGVuY3J5cHRlZEtleXMgaWYgbmVlZGVkXG4gICAqL1xuICBhc3luYyBnZXRTZXNzaW9uS2V5KFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGVuY3J5cHRlZEtleXM/OiBFbmNyeXB0ZWRTZXNzaW9uS2V5W11cbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBjb25zdCBjYWNoZWRLZXkgPSB0aGlzLnNlc3Npb25LZXlDYWNoZS5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoY2FjaGVkS2V5KSB7XG4gICAgICByZXR1cm4gY2FjaGVkS2V5O1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBkZWNyeXB0IGZyb20gZW5jcnlwdGVkIGtleXNcbiAgICBpZiAoIWVuY3J5cHRlZEtleXMgfHwgZW5jcnlwdGVkS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRldmljZUlkID0gYXdhaXQgdGhpcy5nZXREZXZpY2VJZCgpO1xuICAgIGNvbnN0IG91ckVuY3J5cHRlZEtleSA9IGVuY3J5cHRlZEtleXMuZmluZCgoaykgPT4gay5kZXZpY2VJZCA9PT0gZGV2aWNlSWQpO1xuICAgIGlmICghb3VyRW5jcnlwdGVkS2V5KSB7XG4gICAgICBsb2dnZXIud2FybihgW0tleWNoYWluTWFuYWdlcl0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCBpbiBlbmNyeXB0ZWRLZXlzYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3VyIHByaXZhdGUga2V5XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJpdmF0ZUtleSgpO1xuXG4gICAgLy8gRGVjcnlwdCBzZXNzaW9uIGtleVxuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcnlwdG9TZXJ2aWNlLmRlY3J5cHRTZXNzaW9uS2V5KG91ckVuY3J5cHRlZEtleSwgcHJpdmF0ZUtleSk7XG5cbiAgICAvLyBDYWNoZSBmb3IgZnV0dXJlIHVzZVxuICAgIHRoaXMuc2Vzc2lvbktleUNhY2hlLnNldChzZXNzaW9uSWQsIHNlc3Npb25LZXkpO1xuICAgIGxvZ2dlci5pbmZvKGBbS2V5Y2hhaW5NYW5hZ2VyXSBEZWNyeXB0ZWQgYW5kIGNhY2hlZCBzZXNzaW9uIGtleSBmb3IgJHtzZXNzaW9uSWR9YCk7XG5cbiAgICByZXR1cm4gc2Vzc2lvbktleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbmQgZW5jcnlwdCBhIG5ldyBzZXNzaW9uIGtleSBmb3IgYWxsIGRldmljZXNcbiAgICovXG4gIGNyZWF0ZVNlc3Npb25LZXkoXG4gICAgZGV2aWNlUHVibGljS2V5czogQXJyYXk8eyBkZXZpY2VJZDogc3RyaW5nOyBwdWJsaWNLZXk6IHN0cmluZyB9PlxuICApOiB7IHNlc3Npb25LZXk6IHN0cmluZzsgZW5jcnlwdGVkS2V5czogRW5jcnlwdGVkU2Vzc2lvbktleVtdIH0ge1xuICAgIC8vIEdlbmVyYXRlIHJhbmRvbSBzZXNzaW9uIGtleVxuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcnlwdG9TZXJ2aWNlLmdlbmVyYXRlU2Vzc2lvbktleSgpO1xuXG4gICAgLy8gRW5jcnlwdCBmb3IgZWFjaCBkZXZpY2VcbiAgICBjb25zdCBlbmNyeXB0ZWRLZXlzOiBFbmNyeXB0ZWRTZXNzaW9uS2V5W10gPSBkZXZpY2VQdWJsaWNLZXlzLm1hcCgoZGV2aWNlKSA9PiB7XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBjcnlwdG9TZXJ2aWNlLmVuY3J5cHRTZXNzaW9uS2V5KFxuICAgICAgICBzZXNzaW9uS2V5LFxuICAgICAgICBkZXZpY2UucHVibGljS2V5XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmRldmljZUlkLFxuICAgICAgICBlbmNyeXB0ZWRLZXk6IGVuY3J5cHRlZC5lbmNyeXB0ZWRLZXksXG4gICAgICAgIGVwaGVtZXJhbFB1YmxpY0tleTogZW5jcnlwdGVkLmVwaGVtZXJhbFB1YmxpY0tleSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgW0tleWNoYWluTWFuYWdlcl0gQ3JlYXRlZCBzZXNzaW9uIGtleSBmb3IgJHtkZXZpY2VQdWJsaWNLZXlzLmxlbmd0aH0gZGV2aWNlc2ApO1xuICAgIHJldHVybiB7IHNlc3Npb25LZXksIGVuY3J5cHRlZEtleXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWNoZSBhIHNlc3Npb24ga2V5XG4gICAqL1xuICBjYWNoZVNlc3Npb25LZXkoc2Vzc2lvbklkOiBzdHJpbmcsIHNlc3Npb25LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbktleUNhY2hlLnNldChzZXNzaW9uSWQsIHNlc3Npb25LZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGNhY2hlZCBzZXNzaW9uIGtleVxuICAgKi9cbiAgY2xlYXJTZXNzaW9uS2V5KHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXNzaW9uS2V5Q2FjaGUuZGVsZXRlKHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBzZXNzaW9uIGtleXNcbiAgICovXG4gIGNsZWFyQWxsU2Vzc2lvbktleXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZXNzaW9uS2V5Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIE1BUks6IC0gUmVnaXN0cmF0aW9uIFN0YXR1c1xuXG4gIC8qKlxuICAgKiBHZXQgcmVnaXN0cmF0aW9uIHN0YXR1c1xuICAgKi9cbiAgZ2V0SXNSZWdpc3RlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVnaXN0ZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVnaXN0cmF0aW9uIHN0YXR1c1xuICAgKi9cbiAgc2V0SXNSZWdpc3RlcmVkKHJlZ2lzdGVyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzUmVnaXN0ZXJlZCA9IHJlZ2lzdGVyZWQ7XG4gIH1cblxuICAvLyBNQVJLOiAtIERldmljZSBJbmZvXG5cbiAgLyoqXG4gICAqIEdldCBkZXZpY2UgbmFtZSBmb3IgcmVnaXN0cmF0aW9uXG4gICAqL1xuICBnZXREZXZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9zLmhvc3RuYW1lKCkgfHwgJ0NMSSBDbGllbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwbGF0Zm9ybSBmb3IgcmVnaXN0cmF0aW9uXG4gICAqL1xuICBnZXREZXZpY2VQbGF0Zm9ybSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gb3MucGxhdGZvcm0oKTtcbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgICByZXR1cm4gJ01BQ09TJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICByZXR1cm4gJ0xJTlVYJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICByZXR1cm4gJ1dJTkRPV1MnO1xuICAgIH1cbiAgICByZXR1cm4gJ0NMSSc7XG4gIH1cblxuICAvLyBNQVJLOiAtIEZ1bGwgUmVzZXRcblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGRhdGEgKGRldmljZSBpZGVudGl0eSArIGFsbCB0b2tlbnMpXG4gICAqL1xuICBhc3luYyBjbGVhckFsbERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVEZXZpY2VJZGVudGl0eSgpO1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlVG9rZW5zKCdkZXZlbG9wbWVudCcpO1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlVG9rZW5zKCdwcm9kdWN0aW9uJyk7XG4gICAgdGhpcy5zZXNzaW9uS2V5Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuICAgIGxvZ2dlci5pbmZvKCdbS2V5Y2hhaW5NYW5hZ2VyXSBDbGVhcmVkIGFsbCBkYXRhJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvcnQgc2luZ2xldG9uIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBrZXljaGFpbk1hbmFnZXIgPSBLZXljaGFpbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Logger, logger, createLogger } from './logger';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLogger = exports.logger = exports.Logger = void 0;
|
|
4
|
+
var logger_1 = require("./logger");
|
|
5
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
|
|
6
|
+
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
|
|
7
|
+
Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9nZ2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUF3RDtBQUEvQyxnR0FBQSxNQUFNLE9BQUE7QUFBRSxnR0FBQSxNQUFNLE9BQUE7QUFBRSxzR0FBQSxZQUFZLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBMb2dnZXIsIGxvZ2dlciwgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuIl19
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
interface LoggerOptions {
|
|
3
|
+
name: string;
|
|
4
|
+
logFile?: string;
|
|
5
|
+
level?: LogLevel;
|
|
6
|
+
console?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Simple logger for CodeVibe plugins
|
|
10
|
+
*/
|
|
11
|
+
export declare class Logger {
|
|
12
|
+
private name;
|
|
13
|
+
private logFile?;
|
|
14
|
+
private level;
|
|
15
|
+
private enableConsole;
|
|
16
|
+
constructor(options: LoggerOptions);
|
|
17
|
+
private ensureLogDir;
|
|
18
|
+
private shouldLog;
|
|
19
|
+
private formatMessage;
|
|
20
|
+
private log;
|
|
21
|
+
debug(message: string, data?: any): void;
|
|
22
|
+
info(message: string, data?: any): void;
|
|
23
|
+
warn(message: string, data?: any): void;
|
|
24
|
+
error(message: string, data?: any): void;
|
|
25
|
+
setLevel(level: LogLevel): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a logger with custom options
|
|
29
|
+
*/
|
|
30
|
+
export declare function createLogger(options: LoggerOptions): Logger;
|
|
31
|
+
/**
|
|
32
|
+
* Default shared logger instance
|
|
33
|
+
*/
|
|
34
|
+
export declare const logger: Logger;
|
|
35
|
+
export {};
|