langmart-gateway-type3 3.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/.env.example +29 -0
- package/README.md +480 -0
- package/dist/bash-tools.d.ts +56 -0
- package/dist/bash-tools.d.ts.map +1 -0
- package/dist/bash-tools.js +188 -0
- package/dist/bash-tools.js.map +1 -0
- package/dist/core-tools.d.ts +94 -0
- package/dist/core-tools.d.ts.map +1 -0
- package/dist/core-tools.js +694 -0
- package/dist/core-tools.js.map +1 -0
- package/dist/debug-utils.d.ts +22 -0
- package/dist/debug-utils.d.ts.map +1 -0
- package/dist/debug-utils.js +37 -0
- package/dist/debug-utils.js.map +1 -0
- package/dist/devops-tools.d.ts +147 -0
- package/dist/devops-tools.d.ts.map +1 -0
- package/dist/devops-tools.js +718 -0
- package/dist/devops-tools.js.map +1 -0
- package/dist/gateway-config.d.ts +56 -0
- package/dist/gateway-config.d.ts.map +1 -0
- package/dist/gateway-config.js +198 -0
- package/dist/gateway-config.js.map +1 -0
- package/dist/gateway-mode.d.ts +58 -0
- package/dist/gateway-mode.d.ts.map +1 -0
- package/dist/gateway-mode.js +240 -0
- package/dist/gateway-mode.js.map +1 -0
- package/dist/gateway-server.d.ts +208 -0
- package/dist/gateway-server.d.ts.map +1 -0
- package/dist/gateway-server.js +1811 -0
- package/dist/gateway-server.js.map +1 -0
- package/dist/headless-session.d.ts +192 -0
- package/dist/headless-session.d.ts.map +1 -0
- package/dist/headless-session.js +584 -0
- package/dist/headless-session.js.map +1 -0
- package/dist/index-server.d.ts +4 -0
- package/dist/index-server.d.ts.map +1 -0
- package/dist/index-server.js +129 -0
- package/dist/index-server.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/key-vault.d.ts +102 -0
- package/dist/key-vault.d.ts.map +1 -0
- package/dist/key-vault.js +365 -0
- package/dist/key-vault.js.map +1 -0
- package/dist/local-vault.d.ts +195 -0
- package/dist/local-vault.d.ts.map +1 -0
- package/dist/local-vault.js +571 -0
- package/dist/local-vault.js.map +1 -0
- package/dist/marketplace-tools.d.ts +104 -0
- package/dist/marketplace-tools.d.ts.map +1 -0
- package/dist/marketplace-tools.js +2846 -0
- package/dist/marketplace-tools.js.map +1 -0
- package/dist/mcp-manager.d.ts +114 -0
- package/dist/mcp-manager.d.ts.map +1 -0
- package/dist/mcp-manager.js +338 -0
- package/dist/mcp-manager.js.map +1 -0
- package/dist/web-tools.d.ts +86 -0
- package/dist/web-tools.d.ts.map +1 -0
- package/dist/web-tools.js +431 -0
- package/dist/web-tools.js.map +1 -0
- package/dist/websocket-handler.d.ts +131 -0
- package/dist/websocket-handler.d.ts.map +1 -0
- package/dist/websocket-handler.js +596 -0
- package/dist/websocket-handler.js.map +1 -0
- package/dist/welcome-pages.d.ts +6 -0
- package/dist/welcome-pages.d.ts.map +1 -0
- package/dist/welcome-pages.js +200 -0
- package/dist/welcome-pages.js.map +1 -0
- package/package.json +168 -0
- package/scripts/install-remote.sh +282 -0
- package/scripts/start.sh +85 -0
- package/scripts/status.sh +79 -0
- package/scripts/stop.sh +67 -0
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LocalVault = void 0;
|
|
37
|
+
const debug_utils_1 = require("./debug-utils");
|
|
38
|
+
// File: gateway-type3/local-vault.ts
|
|
39
|
+
// Local vault for storing access point API keys securely
|
|
40
|
+
// Type 3 gateways manage their own credentials locally
|
|
41
|
+
// Keys are stored by connection_id, not provider name
|
|
42
|
+
const crypto_1 = require("crypto");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
/**
|
|
46
|
+
* Local Vault for Gateway Type 3
|
|
47
|
+
*
|
|
48
|
+
* TWO-PART ARCHITECTURE:
|
|
49
|
+
*
|
|
50
|
+
* Part 1: Clear Text Configuration (.vault/config.json)
|
|
51
|
+
* - Human-readable JSON
|
|
52
|
+
* - Maps provider names to connection_id UUIDs
|
|
53
|
+
* - Editable by users
|
|
54
|
+
* - NOT encrypted
|
|
55
|
+
*
|
|
56
|
+
* Part 2: Encrypted Keystore (.vault/keystore.enc)
|
|
57
|
+
* - AES-256-GCM encrypted credentials
|
|
58
|
+
* - Base64-encoded for readability
|
|
59
|
+
* - Header with DO NOT EDIT warnings
|
|
60
|
+
* - Maps connection_id to API keys
|
|
61
|
+
*
|
|
62
|
+
* Key Features:
|
|
63
|
+
* - Separation of configuration and secrets
|
|
64
|
+
* - Clear warnings against manual keystore edits
|
|
65
|
+
* - User-friendly configuration editing
|
|
66
|
+
* - Secure credential storage
|
|
67
|
+
*/
|
|
68
|
+
class LocalVault {
|
|
69
|
+
constructor(config) {
|
|
70
|
+
this.cache = new Map();
|
|
71
|
+
this.algorithm = 'aes-256-gcm';
|
|
72
|
+
this.userId = config.userId;
|
|
73
|
+
// If userId provided, use user-specific path: ~/.langmart/users/<userId>/
|
|
74
|
+
// Otherwise, use legacy path: ~/.langmart/
|
|
75
|
+
if (config.userId) {
|
|
76
|
+
const os = require('os');
|
|
77
|
+
const homeDir = os.homedir();
|
|
78
|
+
const basePath = path.join(homeDir, '.langmart', 'users', config.userId);
|
|
79
|
+
this.vaultDir = config.vaultPath || basePath;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.vaultDir = config.vaultPath || path.join(process.cwd(), '.vault');
|
|
83
|
+
}
|
|
84
|
+
this.configPath = path.join(this.vaultDir, 'config.json');
|
|
85
|
+
this.keystorePath = path.join(this.vaultDir, 'keystore.enc');
|
|
86
|
+
// Derive master key from password
|
|
87
|
+
const password = config.masterPassword || process.env.VAULT_MASTER_PASSWORD || 'default-dev-password';
|
|
88
|
+
const salt = Buffer.from('langmart-type3-salt', 'utf8'); // In production, use random salt
|
|
89
|
+
this.masterKey = (0, crypto_1.scryptSync)(password, salt, 32);
|
|
90
|
+
// Ensure vault directory exists
|
|
91
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Constructor called for path: ${this.vaultDir}`);
|
|
92
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Directory exists: ${fs.existsSync(this.vaultDir)}`);
|
|
93
|
+
if (!fs.existsSync(this.vaultDir)) {
|
|
94
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Creating directory: ${this.vaultDir}`);
|
|
95
|
+
try {
|
|
96
|
+
fs.mkdirSync(this.vaultDir, { recursive: true });
|
|
97
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Directory created successfully`);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(`[LocalVault] Failed to create directory:`, error.message);
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Directory already exists`);
|
|
106
|
+
}
|
|
107
|
+
// Initialize empty config
|
|
108
|
+
this.config = {
|
|
109
|
+
version: '1.0',
|
|
110
|
+
comment: 'Editable configuration mapping provider names to access point IDs',
|
|
111
|
+
connections: {}
|
|
112
|
+
};
|
|
113
|
+
// Load existing configuration and credentials
|
|
114
|
+
this.loadConfig();
|
|
115
|
+
this.loadKeystore();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get singleton instance for a specific user
|
|
119
|
+
* Uses ~/.langmart/users/<userId> as vault directory for user-specific storage
|
|
120
|
+
*
|
|
121
|
+
* @param userId - User ID (optional for backward compatibility)
|
|
122
|
+
*/
|
|
123
|
+
static getInstance(userId) {
|
|
124
|
+
const key = userId || 'default';
|
|
125
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] getInstance called with key: ${key}`);
|
|
126
|
+
if (!LocalVault.instances.has(key)) {
|
|
127
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Creating NEW instance for key: ${key}`);
|
|
128
|
+
const os = require('os');
|
|
129
|
+
const homeDir = os.homedir();
|
|
130
|
+
let vaultPath;
|
|
131
|
+
if (userId) {
|
|
132
|
+
vaultPath = path.join(homeDir, '.langmart', 'users', userId);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Legacy path for backward compatibility
|
|
136
|
+
vaultPath = path.join(homeDir, '.langmart');
|
|
137
|
+
}
|
|
138
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Vault path will be: ${vaultPath}`);
|
|
139
|
+
LocalVault.instances.set(key, new LocalVault({
|
|
140
|
+
vaultPath,
|
|
141
|
+
masterPassword: process.env.VAULT_MASTER_PASSWORD || 'default-dev-password',
|
|
142
|
+
userId
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Returning CACHED instance for key: ${key}`);
|
|
147
|
+
}
|
|
148
|
+
return LocalVault.instances.get(key);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Reset singleton instance (for testing)
|
|
152
|
+
*/
|
|
153
|
+
static resetInstance(userId) {
|
|
154
|
+
const key = userId || 'default';
|
|
155
|
+
LocalVault.instances.delete(key);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Reset all singleton instances (for testing)
|
|
159
|
+
*/
|
|
160
|
+
static resetAllInstances() {
|
|
161
|
+
LocalVault.instances.clear();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get the user ID associated with this vault
|
|
165
|
+
*/
|
|
166
|
+
getUserId() {
|
|
167
|
+
return this.userId;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get the vault directory path
|
|
171
|
+
*/
|
|
172
|
+
getVaultPath() {
|
|
173
|
+
return this.vaultDir;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if legacy vault exists (data in ~/.langmart/ instead of ~/.langmart/users/<userId>/)
|
|
177
|
+
*/
|
|
178
|
+
static hasLegacyVault() {
|
|
179
|
+
const os = require('os');
|
|
180
|
+
const homeDir = os.homedir();
|
|
181
|
+
const legacyPath = path.join(homeDir, '.langmart');
|
|
182
|
+
const legacyKeystore = path.join(legacyPath, 'keystore.enc');
|
|
183
|
+
return fs.existsSync(legacyKeystore);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Migrate legacy vault data to user-specific vault
|
|
187
|
+
* Call this after validating the API key to get the user ID
|
|
188
|
+
*
|
|
189
|
+
* @param userId - User ID to migrate data to
|
|
190
|
+
* @returns true if migration was successful, false if no legacy data found
|
|
191
|
+
*/
|
|
192
|
+
static async migrateLegacyVault(userId) {
|
|
193
|
+
const os = require('os');
|
|
194
|
+
const homeDir = os.homedir();
|
|
195
|
+
const legacyPath = path.join(homeDir, '.langmart');
|
|
196
|
+
const legacyKeystore = path.join(legacyPath, 'keystore.enc');
|
|
197
|
+
const legacyConfig = path.join(legacyPath, 'config.json');
|
|
198
|
+
// Check if legacy vault exists
|
|
199
|
+
if (!fs.existsSync(legacyKeystore)) {
|
|
200
|
+
(0, debug_utils_1.debugLog)('[LocalVault] No legacy vault found, skipping migration');
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] 🔄 Migrating legacy vault to user-specific vault for user: ${userId}`);
|
|
204
|
+
try {
|
|
205
|
+
// Load legacy vault
|
|
206
|
+
const legacyVault = new LocalVault({
|
|
207
|
+
vaultPath: legacyPath,
|
|
208
|
+
masterPassword: process.env.VAULT_MASTER_PASSWORD || 'default-dev-password'
|
|
209
|
+
});
|
|
210
|
+
// Create new user-specific vault
|
|
211
|
+
const newVault = LocalVault.getInstance(userId);
|
|
212
|
+
// Export credentials from legacy vault
|
|
213
|
+
const credentials = legacyVault.export();
|
|
214
|
+
// Import into new vault
|
|
215
|
+
for (const [accessPointId, apiKey] of Object.entries(credentials)) {
|
|
216
|
+
await newVault.setCredential(accessPointId, apiKey);
|
|
217
|
+
}
|
|
218
|
+
// Copy config if it exists
|
|
219
|
+
if (fs.existsSync(legacyConfig)) {
|
|
220
|
+
const configData = fs.readFileSync(legacyConfig, 'utf8');
|
|
221
|
+
const config = JSON.parse(configData);
|
|
222
|
+
// Copy connection mappings to new vault
|
|
223
|
+
for (const [providerName, apConfig] of Object.entries(config.connections || {})) {
|
|
224
|
+
const ap = apConfig;
|
|
225
|
+
newVault.config.connections[providerName] = ap;
|
|
226
|
+
}
|
|
227
|
+
await newVault.saveConfig();
|
|
228
|
+
}
|
|
229
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] ✅ Migrated ${Object.keys(credentials).length} credentials to user vault`);
|
|
230
|
+
// Rename legacy vault to .langmart.backup
|
|
231
|
+
const backupPath = path.join(homeDir, '.langmart.backup');
|
|
232
|
+
if (fs.existsSync(backupPath)) {
|
|
233
|
+
// If backup already exists, append timestamp
|
|
234
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
235
|
+
const timestampedBackup = path.join(homeDir, `.langmart.backup-${timestamp}`);
|
|
236
|
+
fs.renameSync(legacyPath, timestampedBackup);
|
|
237
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] 📦 Legacy vault backed up to: ${timestampedBackup}`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
fs.renameSync(legacyPath, backupPath);
|
|
241
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] 📦 Legacy vault backed up to: ${backupPath}`);
|
|
242
|
+
}
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.error(`[LocalVault] ❌ Migration failed:`, error.message);
|
|
247
|
+
console.error(`[LocalVault] Legacy vault preserved at: ${legacyPath}`);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Store API key for an access point
|
|
253
|
+
* @param accessPointId - UUID of the access point
|
|
254
|
+
* @param apiKey - Provider API key
|
|
255
|
+
* @param provider - Optional provider name for config mapping
|
|
256
|
+
* @param description - Optional description for config
|
|
257
|
+
*/
|
|
258
|
+
async setCredential(accessPointId, apiKey, provider, description) {
|
|
259
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Storing credential for connection_id: ${accessPointId}`);
|
|
260
|
+
// Update cache
|
|
261
|
+
this.cache.set(accessPointId, apiKey);
|
|
262
|
+
// Update config if provider name provided
|
|
263
|
+
if (provider) {
|
|
264
|
+
this.config.connections[provider] = {
|
|
265
|
+
connection_id: accessPointId,
|
|
266
|
+
provider: provider,
|
|
267
|
+
description: description || `${provider} access point`
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// Save both files to disk
|
|
271
|
+
await this.saveConfig();
|
|
272
|
+
await this.saveKeystore();
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get API key for an access point
|
|
276
|
+
* @param accessPointId - UUID of the access point
|
|
277
|
+
*/
|
|
278
|
+
getCredential(accessPointId) {
|
|
279
|
+
return this.cache.get(accessPointId);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Check if access point has credential
|
|
283
|
+
* @param accessPointId - UUID of the access point
|
|
284
|
+
*/
|
|
285
|
+
hasCredential(accessPointId) {
|
|
286
|
+
return this.cache.has(accessPointId);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* List all access point IDs with credentials
|
|
290
|
+
*/
|
|
291
|
+
listAccessPoints() {
|
|
292
|
+
return Array.from(this.cache.keys());
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Remove credential for an access point
|
|
296
|
+
* @param accessPointId - UUID of the access point
|
|
297
|
+
*/
|
|
298
|
+
async removeCredential(accessPointId) {
|
|
299
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Removing credential for connection_id: ${accessPointId}`);
|
|
300
|
+
this.cache.delete(accessPointId);
|
|
301
|
+
// Remove from config as well
|
|
302
|
+
for (const [providerName, apConfig] of Object.entries(this.config.connections)) {
|
|
303
|
+
if (apConfig.connection_id === accessPointId) {
|
|
304
|
+
delete this.config.connections[providerName];
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
await this.saveConfig();
|
|
309
|
+
await this.saveKeystore();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Clear all credentials
|
|
313
|
+
*/
|
|
314
|
+
async clearAll() {
|
|
315
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Clearing all credentials`);
|
|
316
|
+
this.cache.clear();
|
|
317
|
+
this.config.connections = {};
|
|
318
|
+
await this.saveConfig();
|
|
319
|
+
await this.saveKeystore();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Store gateway authentication API key
|
|
323
|
+
* Special key stored with reserved ID '__gateway_auth__'
|
|
324
|
+
*/
|
|
325
|
+
async setAuthKey(apiKey) {
|
|
326
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Storing gateway authentication key`);
|
|
327
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Vault directory: ${this.vaultDir}`);
|
|
328
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Keystore path: ${this.keystorePath}`);
|
|
329
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] User ID: ${this.userId || 'undefined'}`);
|
|
330
|
+
// Ensure directory exists before saving (in case constructor didn't run)
|
|
331
|
+
if (!fs.existsSync(this.vaultDir)) {
|
|
332
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Directory doesn't exist, creating: ${this.vaultDir}`);
|
|
333
|
+
fs.mkdirSync(this.vaultDir, { recursive: true });
|
|
334
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Directory created successfully`);
|
|
335
|
+
}
|
|
336
|
+
this.cache.set('__gateway_auth__', apiKey);
|
|
337
|
+
await this.saveKeystore();
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get gateway authentication API key
|
|
341
|
+
*/
|
|
342
|
+
getAuthKey() {
|
|
343
|
+
return this.cache.get('__gateway_auth__');
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Check if gateway authentication key is stored
|
|
347
|
+
*/
|
|
348
|
+
hasAuthKey() {
|
|
349
|
+
return this.cache.has('__gateway_auth__');
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Remove gateway authentication key (logout)
|
|
353
|
+
*/
|
|
354
|
+
async removeAuthKey() {
|
|
355
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Removing gateway authentication key`);
|
|
356
|
+
this.cache.delete('__gateway_auth__');
|
|
357
|
+
await this.saveKeystore();
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Load clear text configuration
|
|
361
|
+
*/
|
|
362
|
+
loadConfig() {
|
|
363
|
+
try {
|
|
364
|
+
if (!fs.existsSync(this.configPath)) {
|
|
365
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] No existing config found at ${this.configPath}`);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const configData = fs.readFileSync(this.configPath, 'utf8');
|
|
369
|
+
this.config = JSON.parse(configData);
|
|
370
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Loaded config with ${Object.keys(this.config.connections).length} access point mappings`);
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
console.error(`[LocalVault] Failed to load config:`, error.message);
|
|
374
|
+
// Keep default empty config
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Save clear text configuration
|
|
379
|
+
*/
|
|
380
|
+
async saveConfig() {
|
|
381
|
+
try {
|
|
382
|
+
const configJson = JSON.stringify(this.config, null, 2);
|
|
383
|
+
fs.writeFileSync(this.configPath, configJson);
|
|
384
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Saved config with ${Object.keys(this.config.connections).length} access point mappings`);
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
console.error(`[LocalVault] Failed to save config:`, error.message);
|
|
388
|
+
throw error;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Load encrypted keystore
|
|
393
|
+
*/
|
|
394
|
+
loadKeystore() {
|
|
395
|
+
try {
|
|
396
|
+
if (!fs.existsSync(this.keystorePath)) {
|
|
397
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] No existing keystore found at ${this.keystorePath}`);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// Read file and skip header comments (lines starting with #)
|
|
401
|
+
const fileContent = fs.readFileSync(this.keystorePath, 'utf8');
|
|
402
|
+
const lines = fileContent.split('\n');
|
|
403
|
+
const base64Data = lines
|
|
404
|
+
.filter(line => line.trim() && !line.trim().startsWith('#'))
|
|
405
|
+
.join('');
|
|
406
|
+
// Decode base64 to get encrypted binary
|
|
407
|
+
const encrypted = Buffer.from(base64Data, 'base64');
|
|
408
|
+
// Decrypt
|
|
409
|
+
const decrypted = this.decrypt(encrypted);
|
|
410
|
+
const data = JSON.parse(decrypted);
|
|
411
|
+
// Load into cache (keys are connection_id UUIDs)
|
|
412
|
+
Object.entries(data.credentials || {}).forEach(([accessPointId, apiKey]) => {
|
|
413
|
+
this.cache.set(accessPointId, apiKey);
|
|
414
|
+
});
|
|
415
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Loaded ${this.cache.size} credentials from keystore`);
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
console.error(`[LocalVault] Failed to load keystore:`, error.message);
|
|
419
|
+
// If decryption fails, start with empty vault
|
|
420
|
+
this.cache.clear();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Save encrypted keystore with header warnings
|
|
425
|
+
*/
|
|
426
|
+
async saveKeystore() {
|
|
427
|
+
try {
|
|
428
|
+
const data = {
|
|
429
|
+
version: '1.0',
|
|
430
|
+
created_at: new Date().toISOString(),
|
|
431
|
+
credentials: Object.fromEntries(this.cache)
|
|
432
|
+
};
|
|
433
|
+
const json = JSON.stringify(data);
|
|
434
|
+
const encrypted = this.encrypt(json);
|
|
435
|
+
// Convert to base64 for readable encoding
|
|
436
|
+
const base64 = encrypted.toString('base64');
|
|
437
|
+
// Split into 64-character lines for readability
|
|
438
|
+
const lines = [];
|
|
439
|
+
for (let i = 0; i < base64.length; i += 64) {
|
|
440
|
+
lines.push(base64.substring(i, Math.min(i + 64, base64.length)));
|
|
441
|
+
}
|
|
442
|
+
// Create file with header warnings
|
|
443
|
+
const header = `# ===================================================================
|
|
444
|
+
# GATEWAY TYPE 3 ENCRYPTED KEYSTORE
|
|
445
|
+
# ===================================================================
|
|
446
|
+
#
|
|
447
|
+
# ⚠️ DO NOT EDIT THIS FILE MANUALLY ⚠️
|
|
448
|
+
#
|
|
449
|
+
# This file contains AES-256-GCM encrypted API credentials.
|
|
450
|
+
# The encrypted data is base64-encoded for readability but remains
|
|
451
|
+
# cryptographically secure.
|
|
452
|
+
#
|
|
453
|
+
# To add, update, or remove credentials:
|
|
454
|
+
# 1. Use the Gateway Type 3 management CLI
|
|
455
|
+
# 2. Or restart the gateway with new environment variables
|
|
456
|
+
#
|
|
457
|
+
# Manual edits will corrupt the encryption and cause failures.
|
|
458
|
+
#
|
|
459
|
+
# Format: Base64-encoded encrypted binary data
|
|
460
|
+
# Encryption: AES-256-GCM with scrypt-derived key
|
|
461
|
+
# Stored credentials: ${this.cache.size}
|
|
462
|
+
# Last updated: ${new Date().toISOString()}
|
|
463
|
+
# ===================================================================
|
|
464
|
+
|
|
465
|
+
`;
|
|
466
|
+
const content = header + lines.join('\n') + '\n';
|
|
467
|
+
fs.writeFileSync(this.keystorePath, content);
|
|
468
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Saved ${this.cache.size} credentials to keystore`);
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
console.error(`[LocalVault] Failed to save keystore:`, error.message);
|
|
472
|
+
throw error;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Encrypt data using AES-256-GCM
|
|
477
|
+
*/
|
|
478
|
+
encrypt(plaintext) {
|
|
479
|
+
const iv = (0, crypto_1.randomBytes)(16);
|
|
480
|
+
const cipher = (0, crypto_1.createCipheriv)(this.algorithm, this.masterKey, iv);
|
|
481
|
+
let encrypted = cipher.update(plaintext, 'utf8');
|
|
482
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
483
|
+
const authTag = cipher.getAuthTag();
|
|
484
|
+
// Return: iv + authTag + encrypted
|
|
485
|
+
return Buffer.concat([iv, authTag, encrypted]);
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Decrypt data using AES-256-GCM
|
|
489
|
+
*/
|
|
490
|
+
decrypt(encrypted) {
|
|
491
|
+
const iv = encrypted.subarray(0, 16);
|
|
492
|
+
const authTag = encrypted.subarray(16, 32);
|
|
493
|
+
const ciphertext = encrypted.subarray(32);
|
|
494
|
+
const decipher = (0, crypto_1.createDecipheriv)(this.algorithm, this.masterKey, iv);
|
|
495
|
+
decipher.setAuthTag(authTag);
|
|
496
|
+
let decrypted = decipher.update(ciphertext);
|
|
497
|
+
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
498
|
+
return decrypted.toString('utf8');
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Initialize vault with credentials from environment variables
|
|
502
|
+
* NOTE: This is for backward compatibility only
|
|
503
|
+
* In production, use connection_id as key, not provider names
|
|
504
|
+
* Example: vault.setCredential('uuid-of-connection', 'sk-...')
|
|
505
|
+
*/
|
|
506
|
+
async initializeFromEnvironment() {
|
|
507
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Initializing from environment variables (legacy mode)`);
|
|
508
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] WARNING: Using provider names as keys. In production, use connection_id UUIDs.`);
|
|
509
|
+
const providers = ['openai', 'anthropic', 'google', 'groq', 'deepseek', 'mistral'];
|
|
510
|
+
let count = 0;
|
|
511
|
+
for (const provider of providers) {
|
|
512
|
+
const envKey = `${provider.toUpperCase()}_API_KEY`;
|
|
513
|
+
const apiKey = process.env[envKey];
|
|
514
|
+
if (apiKey && !apiKey.includes('mock')) {
|
|
515
|
+
// LEGACY: Using provider name as key
|
|
516
|
+
// PRODUCTION: Should use connection_id UUID
|
|
517
|
+
await this.setCredential(provider, apiKey);
|
|
518
|
+
count++;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Initialized ${count} credentials from environment (legacy provider name keys)`);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Export credentials (for backup - USE WITH CAUTION)
|
|
525
|
+
* Returns map of connection_id -> apiKey
|
|
526
|
+
*/
|
|
527
|
+
export() {
|
|
528
|
+
console.warn(`[LocalVault] WARNING: Exporting credentials in plain text`);
|
|
529
|
+
return Object.fromEntries(this.cache);
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Import credentials (for restore)
|
|
533
|
+
* @param credentials - Map of connection_id -> apiKey
|
|
534
|
+
*/
|
|
535
|
+
async import(credentials) {
|
|
536
|
+
(0, debug_utils_1.debugLog)(`[LocalVault] Importing ${Object.keys(credentials).length} credentials`);
|
|
537
|
+
for (const [accessPointId, apiKey] of Object.entries(credentials)) {
|
|
538
|
+
await this.setCredential(accessPointId, apiKey);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
exports.LocalVault = LocalVault;
|
|
543
|
+
LocalVault.instances = new Map();
|
|
544
|
+
/**
|
|
545
|
+
* Usage Example (PRODUCTION):
|
|
546
|
+
*
|
|
547
|
+
* const vault = new LocalVault({
|
|
548
|
+
* vaultPath: './.vault',
|
|
549
|
+
* masterPassword: 'my-secure-password'
|
|
550
|
+
* });
|
|
551
|
+
*
|
|
552
|
+
* // Store credential using connection_id (from database) with provider mapping
|
|
553
|
+
* await vault.setCredential(
|
|
554
|
+
* '12345678-1234-1234-1234-123456789abc', // connection_id
|
|
555
|
+
* 'sk-...', // API key
|
|
556
|
+
* 'groq', // provider name (optional, for config)
|
|
557
|
+
* 'Groq production endpoint' // description (optional)
|
|
558
|
+
* );
|
|
559
|
+
*
|
|
560
|
+
* // Retrieve credential using connection_id
|
|
561
|
+
* const apiKey = vault.getCredential('12345678-1234-1234-1234-123456789abc');
|
|
562
|
+
*
|
|
563
|
+
* // Check available access points
|
|
564
|
+
* const accessPoints = vault.listAccessPoints();
|
|
565
|
+
* debugLog('Stored credentials for:', accessPoints);
|
|
566
|
+
*
|
|
567
|
+
* // Files created:
|
|
568
|
+
* // .vault/config.json - Clear text, editable, maps provider names to UUIDs
|
|
569
|
+
* // .vault/keystore.enc - Encrypted, base64-encoded, with DO NOT EDIT warnings
|
|
570
|
+
*/
|
|
571
|
+
//# sourceMappingURL=local-vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-vault.js","sourceRoot":"","sources":["../local-vault.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAyC;AACzC,qCAAqC;AACrC,yDAAyD;AACzD,uDAAuD;AACvD,sDAAsD;AAEtD,mCAAmF;AACnF,uCAAyB;AACzB,2CAA6B;AAsB7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,UAAU;IAYnB,YAAY,MAIX;QATO,UAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;QAEvC,cAAS,GAAG,aAAa,CAAC;QAQ9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAE5B,0EAA0E;QAC1E,2CAA2C;QAC3C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC;QACjD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE7D,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,sBAAsB,CAAC;QACtG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,iCAAiC;QAC1F,IAAI,CAAC,SAAS,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAEhD,gCAAgC;QAChC,IAAA,sBAAQ,EAAC,6CAA6C,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvE,IAAA,sBAAQ,EAAC,kCAAkC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAA,sBAAQ,EAAC,oCAAoC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,IAAA,sBAAQ,EAAC,6CAA6C,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzE,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAA,sBAAQ,EAAC,uCAAuC,CAAC,CAAC;QACtD,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,MAAM,GAAG;YACV,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,mEAAmE;YAC5E,WAAW,EAAE,EAAE;SAClB,CAAC;QAEF,8CAA8C;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,MAAe;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,CAAC;QAChC,IAAA,sBAAQ,EAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,IAAA,sBAAQ,EAAC,+CAA+C,GAAG,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAE7B,IAAI,SAAiB,CAAC;YACtB,IAAI,MAAM,EAAE,CAAC;gBACT,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACJ,yCAAyC;gBACzC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAChD,CAAC;YAED,IAAA,sBAAQ,EAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;YAC1D,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC;gBACzC,SAAS;gBACT,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,sBAAsB;gBAC3E,MAAM;aACT,CAAC,CAAC,CAAC;QACR,CAAC;aAAM,CAAC;YACJ,IAAA,sBAAQ,EAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,aAAa,CAAC,MAAe;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,CAAC;QAChC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,iBAAiB;QAC3B,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,SAAS;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,YAAY;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc;QACxB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAE7D,OAAO,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACjD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAE1D,+BAA+B;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACjC,IAAA,sBAAQ,EAAC,wDAAwD,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAA,sBAAQ,EAAC,2EAA2E,MAAM,EAAE,CAAC,CAAC;QAE9F,IAAI,CAAC;YACD,oBAAoB;YACpB,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC;gBAC/B,SAAS,EAAE,UAAU;gBACrB,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,sBAAsB;aAC9E,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAEhD,uCAAuC;YACvC,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YAEzC,wBAAwB;YACxB,KAAK,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,MAAM,QAAQ,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;YAED,2BAA2B;YAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEtC,wCAAwC;gBACxC,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC9E,MAAM,EAAE,GAAG,QAA6B,CAAC;oBACzC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBACnD,CAAC;gBAED,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAChC,CAAC;YAED,IAAA,sBAAQ,EAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,4BAA4B,CAAC,CAAC;YAEjG,0CAA0C;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,6CAA6C;gBAC7C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACjE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,SAAS,EAAE,CAAC,CAAC;gBAC9E,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;gBAC7C,IAAA,sBAAQ,EAAC,8CAA8C,iBAAiB,EAAE,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACJ,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACtC,IAAA,sBAAQ,EAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,aAAa,CACtB,aAAqB,EACrB,MAAc,EACd,QAAiB,EACjB,WAAoB;QAEpB,IAAA,sBAAQ,EAAC,sDAAsD,aAAa,EAAE,CAAC,CAAC;QAEhF,eAAe;QACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAEtC,0CAA0C;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG;gBAChC,aAAa,EAAE,aAAa;gBAC5B,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,WAAW,IAAI,GAAG,QAAQ,eAAe;aACzD,CAAC;QACN,CAAC;QAED,0BAA0B;QAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,aAAqB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,aAAqB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,gBAAgB;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,aAAqB;QAC/C,IAAA,sBAAQ,EAAC,uDAAuD,aAAa,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAEjC,6BAA6B;QAC7B,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7E,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;gBAC7C,MAAM;YACV,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ;QACjB,IAAA,sBAAQ,EAAC,uCAAuC,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,UAAU,CAAC,MAAc;QAClC,IAAA,sBAAQ,EAAC,iDAAiD,CAAC,CAAC;QAC5D,IAAA,sBAAQ,EAAC,iCAAiC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAA,sBAAQ,EAAC,+BAA+B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7D,IAAA,sBAAQ,EAAC,yBAAyB,IAAI,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;QAEhE,yEAAyE;QACzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAA,sBAAQ,EAAC,mDAAmD,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7E,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,IAAA,sBAAQ,EAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,UAAU;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,UAAU;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa;QACtB,IAAA,sBAAQ,EAAC,kDAAkD,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,UAAU;QACd,IAAI,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,IAAA,sBAAQ,EAAC,4CAA4C,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,OAAO;YACX,CAAC;YAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAErC,IAAA,sBAAQ,EAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACrH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACpE,4BAA4B;QAChC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU;QACpB,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC9C,IAAA,sBAAQ,EAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACpH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACpE,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY;QAChB,IAAI,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpC,IAAA,sBAAQ,EAAC,8CAA8C,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC5E,OAAO;YACX,CAAC;YAED,6DAA6D;YAC7D,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,KAAK;iBACnB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;YAEd,wCAAwC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEpD,UAAU;YACV,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEnC,iDAAiD;YACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE;gBACvE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,MAAgB,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,IAAA,sBAAQ,EAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,4BAA4B,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,8CAA8C;YAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACtB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG;gBACT,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;aAC9C,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAErC,0CAA0C;YAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE5C,gDAAgD;YAChD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;YAED,mCAAmC;YACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;wBAkBH,IAAI,CAAC,KAAK,CAAC,IAAI;kBACrB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;CAGzC,CAAC;YAEU,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACjD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAE7C,IAAA,sBAAQ,EAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,SAAiB;QAC7B,MAAM,EAAE,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAElE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAI,MAAc,CAAC,UAAU,EAAE,CAAC;QAE7C,mCAAmC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,SAAiB;QAC7B,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrE,QAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5C,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEzD,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,yBAAyB;QAClC,IAAA,sBAAQ,EAAC,oEAAoE,CAAC,CAAC;QAC/E,IAAA,sBAAQ,EAAC,6FAA6F,CAAC,CAAC;QAExG,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACnF,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;YACnD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEnC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,qCAAqC;gBACrC,4CAA4C;gBAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC3C,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;QAED,IAAA,sBAAQ,EAAC,4BAA4B,KAAK,2DAA2D,CAAC,CAAC;IAC3G,CAAC;IAED;;;OAGG;IACI,MAAM;QACT,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CAAC,WAAgD;QAChE,IAAA,sBAAQ,EAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC;QAElF,KAAK,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;;AA9iBL,gCA+iBC;AA9iBkB,oBAAS,GAA4B,IAAI,GAAG,EAAE,AAArC,CAAsC;AAgjBlE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}
|