@fentz26/envcp 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.
Files changed (95) hide show
  1. package/.github/workflows/publish.yml +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +381 -0
  4. package/dist/adapters/base.d.ts +79 -0
  5. package/dist/adapters/base.d.ts.map +1 -0
  6. package/dist/adapters/base.js +317 -0
  7. package/dist/adapters/base.js.map +1 -0
  8. package/dist/adapters/gemini.d.ts +12 -0
  9. package/dist/adapters/gemini.d.ts.map +1 -0
  10. package/dist/adapters/gemini.js +284 -0
  11. package/dist/adapters/gemini.js.map +1 -0
  12. package/dist/adapters/index.d.ts +5 -0
  13. package/dist/adapters/index.d.ts.map +1 -0
  14. package/dist/adapters/index.js +5 -0
  15. package/dist/adapters/index.js.map +1 -0
  16. package/dist/adapters/openai.d.ts +12 -0
  17. package/dist/adapters/openai.d.ts.map +1 -0
  18. package/dist/adapters/openai.js +294 -0
  19. package/dist/adapters/openai.js.map +1 -0
  20. package/dist/adapters/rest.d.ts +12 -0
  21. package/dist/adapters/rest.d.ts.map +1 -0
  22. package/dist/adapters/rest.js +265 -0
  23. package/dist/adapters/rest.js.map +1 -0
  24. package/dist/cli/index.d.ts +2 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/cli/index.js +472 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +3 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config/manager.d.ts +11 -0
  33. package/dist/config/manager.d.ts.map +1 -0
  34. package/dist/config/manager.js +117 -0
  35. package/dist/config/manager.js.map +1 -0
  36. package/dist/index.d.ts +5 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +5 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/mcp/index.d.ts +2 -0
  41. package/dist/mcp/index.d.ts.map +1 -0
  42. package/dist/mcp/index.js +2 -0
  43. package/dist/mcp/index.js.map +1 -0
  44. package/dist/mcp/server.d.ts +24 -0
  45. package/dist/mcp/server.d.ts.map +1 -0
  46. package/dist/mcp/server.js +539 -0
  47. package/dist/mcp/server.js.map +1 -0
  48. package/dist/server/index.d.ts +2 -0
  49. package/dist/server/index.d.ts.map +1 -0
  50. package/dist/server/index.js +2 -0
  51. package/dist/server/index.js.map +1 -0
  52. package/dist/server/unified.d.ts +21 -0
  53. package/dist/server/unified.d.ts.map +1 -0
  54. package/dist/server/unified.js +397 -0
  55. package/dist/server/unified.js.map +1 -0
  56. package/dist/storage/index.d.ts +23 -0
  57. package/dist/storage/index.d.ts.map +1 -0
  58. package/dist/storage/index.js +92 -0
  59. package/dist/storage/index.js.map +1 -0
  60. package/dist/types.d.ts +404 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +92 -0
  63. package/dist/types.js.map +1 -0
  64. package/dist/utils/crypto.d.ts +17 -0
  65. package/dist/utils/crypto.d.ts.map +1 -0
  66. package/dist/utils/crypto.js +73 -0
  67. package/dist/utils/crypto.js.map +1 -0
  68. package/dist/utils/http.d.ts +6 -0
  69. package/dist/utils/http.d.ts.map +1 -0
  70. package/dist/utils/http.js +43 -0
  71. package/dist/utils/http.js.map +1 -0
  72. package/dist/utils/session.d.ts +19 -0
  73. package/dist/utils/session.d.ts.map +1 -0
  74. package/dist/utils/session.js +112 -0
  75. package/dist/utils/session.js.map +1 -0
  76. package/package.json +50 -0
  77. package/src/adapters/base.ts +411 -0
  78. package/src/adapters/gemini.ts +314 -0
  79. package/src/adapters/index.ts +4 -0
  80. package/src/adapters/openai.ts +324 -0
  81. package/src/adapters/rest.ts +294 -0
  82. package/src/cli/index.ts +640 -0
  83. package/src/cli.ts +2 -0
  84. package/src/config/manager.ts +134 -0
  85. package/src/index.ts +4 -0
  86. package/src/mcp/index.ts +1 -0
  87. package/src/mcp/server.ts +623 -0
  88. package/src/server/index.ts +1 -0
  89. package/src/server/unified.ts +460 -0
  90. package/src/storage/index.ts +112 -0
  91. package/src/types.ts +181 -0
  92. package/src/utils/crypto.ts +100 -0
  93. package/src/utils/http.ts +45 -0
  94. package/src/utils/session.ts +141 -0
  95. package/tsconfig.json +20 -0
@@ -0,0 +1,397 @@
1
+ import { RESTAdapter } from '../adapters/rest.js';
2
+ import { OpenAIAdapter } from '../adapters/openai.js';
3
+ import { GeminiAdapter } from '../adapters/gemini.js';
4
+ import { EnvCPServer } from '../mcp/server.js';
5
+ import { setCorsHeaders, sendJson, parseBody, validateApiKey } from '../utils/http.js';
6
+ import * as http from 'http';
7
+ import * as url from 'url';
8
+ export class UnifiedServer {
9
+ config;
10
+ serverConfig;
11
+ projectPath;
12
+ password;
13
+ restAdapter = null;
14
+ openaiAdapter = null;
15
+ geminiAdapter = null;
16
+ mcpServer = null;
17
+ httpServer = null;
18
+ constructor(config, serverConfig, projectPath, password) {
19
+ this.config = config;
20
+ this.serverConfig = serverConfig;
21
+ this.projectPath = projectPath;
22
+ this.password = password;
23
+ }
24
+ // Detect client type from request headers
25
+ detectClientType(req) {
26
+ const userAgent = req.headers['user-agent']?.toLowerCase() || '';
27
+ const contentType = req.headers['content-type'] || '';
28
+ const pathname = url.parse(req.url || '/', true).pathname || '/';
29
+ // Check for OpenAI-style requests
30
+ if (pathname.startsWith('/v1/chat') ||
31
+ pathname.startsWith('/v1/functions') ||
32
+ pathname.startsWith('/v1/tool_calls') ||
33
+ req.headers['openai-organization'] ||
34
+ userAgent.includes('openai')) {
35
+ return 'openai';
36
+ }
37
+ // Check for Gemini-style requests
38
+ if (pathname.includes(':generateContent') ||
39
+ pathname.startsWith('/v1beta') ||
40
+ pathname.startsWith('/v1/function_calls') ||
41
+ req.headers['x-goog-api-key'] ||
42
+ userAgent.includes('google') ||
43
+ userAgent.includes('gemini')) {
44
+ return 'gemini';
45
+ }
46
+ // Check for MCP (typically stdio, but could be HTTP)
47
+ if (req.headers['x-mcp-version'] ||
48
+ userAgent.includes('mcp') ||
49
+ userAgent.includes('claude')) {
50
+ return 'mcp';
51
+ }
52
+ // Default to REST for standard HTTP requests
53
+ if (pathname.startsWith('/api')) {
54
+ return 'rest';
55
+ }
56
+ return 'unknown';
57
+ }
58
+ async start() {
59
+ const { mode, port, host, api_key } = this.serverConfig;
60
+ // MCP mode uses stdio, not HTTP
61
+ if (mode === 'mcp') {
62
+ this.mcpServer = new EnvCPServer(this.config, this.projectPath, this.password);
63
+ await this.mcpServer.start();
64
+ return;
65
+ }
66
+ // Initialize adapters based on mode
67
+ if (mode === 'rest' || mode === 'all' || mode === 'auto') {
68
+ this.restAdapter = new RESTAdapter(this.config, this.projectPath, this.password);
69
+ await this.restAdapter.init();
70
+ }
71
+ if (mode === 'openai' || mode === 'all' || mode === 'auto') {
72
+ this.openaiAdapter = new OpenAIAdapter(this.config, this.projectPath, this.password);
73
+ await this.openaiAdapter.init();
74
+ }
75
+ if (mode === 'gemini' || mode === 'all' || mode === 'auto') {
76
+ this.geminiAdapter = new GeminiAdapter(this.config, this.projectPath, this.password);
77
+ await this.geminiAdapter.init();
78
+ }
79
+ // Single mode - start specific adapter server
80
+ if (mode === 'rest') {
81
+ await this.restAdapter.startServer(port, host, api_key);
82
+ return;
83
+ }
84
+ if (mode === 'openai') {
85
+ await this.openaiAdapter.startServer(port, host, api_key);
86
+ return;
87
+ }
88
+ if (mode === 'gemini') {
89
+ await this.geminiAdapter.startServer(port, host, api_key);
90
+ return;
91
+ }
92
+ // Auto or All mode - unified server that routes based on detection
93
+ this.httpServer = http.createServer(async (req, res) => {
94
+ setCorsHeaders(res);
95
+ if (req.method === 'OPTIONS') {
96
+ res.writeHead(204);
97
+ res.end();
98
+ return;
99
+ }
100
+ // API key validation
101
+ if (api_key) {
102
+ const providedKey = (req.headers['x-api-key'] ||
103
+ req.headers['x-goog-api-key'] ||
104
+ req.headers['authorization']?.replace('Bearer ', ''));
105
+ if (!validateApiKey(providedKey, api_key)) {
106
+ sendJson(res, 401, { error: 'Invalid API key' });
107
+ return;
108
+ }
109
+ }
110
+ const parsedUrl = url.parse(req.url || '/', true);
111
+ const pathname = parsedUrl.pathname || '/';
112
+ // Root endpoint - show server info and detected mode
113
+ if (pathname === '/' && req.method === 'GET') {
114
+ const detectedType = this.serverConfig.auto_detect ? this.detectClientType(req) : 'unknown';
115
+ sendJson(res, 200, {
116
+ name: 'EnvCP Unified Server',
117
+ version: '1.0.0',
118
+ mode: mode,
119
+ detected_client: detectedType,
120
+ auto_detect: this.serverConfig.auto_detect,
121
+ available_modes: ['rest', 'openai', 'gemini', 'mcp'],
122
+ endpoints: {
123
+ rest: '/api/*',
124
+ openai: '/v1/chat/completions, /v1/functions/*, /v1/tool_calls',
125
+ gemini: '/v1/models/envcp:generateContent, /v1/function_calls',
126
+ },
127
+ });
128
+ return;
129
+ }
130
+ // Detect client type
131
+ let clientType = 'unknown';
132
+ if (this.serverConfig.auto_detect) {
133
+ clientType = this.detectClientType(req);
134
+ }
135
+ // Force mode query param
136
+ const forceMode = parsedUrl.query.mode;
137
+ if (forceMode && ['rest', 'openai', 'gemini'].includes(forceMode)) {
138
+ clientType = forceMode;
139
+ }
140
+ try {
141
+ // Route to appropriate adapter
142
+ // REST API routes
143
+ if ((clientType === 'rest' || clientType === 'unknown') && pathname.startsWith('/api')) {
144
+ await this.handleRESTRequest(req, res);
145
+ return;
146
+ }
147
+ // OpenAI routes
148
+ if (clientType === 'openai' || pathname.startsWith('/v1/chat') || pathname.startsWith('/v1/functions') || pathname === '/v1/tool_calls' || pathname === '/v1/models') {
149
+ await this.handleOpenAIRequest(req, res);
150
+ return;
151
+ }
152
+ // Gemini routes
153
+ if (clientType === 'gemini' || pathname.includes(':generateContent') || pathname === '/v1/function_calls' || pathname === '/v1/tools') {
154
+ await this.handleGeminiRequest(req, res);
155
+ return;
156
+ }
157
+ // Default to REST for unknown paths
158
+ if (pathname.startsWith('/api')) {
159
+ await this.handleRESTRequest(req, res);
160
+ return;
161
+ }
162
+ // 404 with helpful info
163
+ sendJson(res, 404, {
164
+ error: 'Not found',
165
+ hint: 'Use /api/* for REST, /v1/* for OpenAI, or include :generateContent for Gemini',
166
+ available_endpoints: {
167
+ rest: '/api/variables, /api/tools',
168
+ openai: '/v1/functions, /v1/chat/completions',
169
+ gemini: '/v1/models/envcp:generateContent',
170
+ },
171
+ });
172
+ }
173
+ catch (error) {
174
+ sendJson(res, 500, { error: error.message });
175
+ }
176
+ });
177
+ return new Promise((resolve) => {
178
+ this.httpServer.listen(port, host, () => {
179
+ resolve();
180
+ });
181
+ });
182
+ }
183
+ async handleRESTRequest(req, res) {
184
+ // Delegate to REST adapter's internal handling
185
+ const parsedUrl = url.parse(req.url || '/', true);
186
+ const pathname = parsedUrl.pathname || '/';
187
+ const segments = pathname.split('/').filter(Boolean);
188
+ if (!this.restAdapter) {
189
+ sendJson(res, 503, { success: false, error: 'REST adapter not initialized' });
190
+ return;
191
+ }
192
+ const body = await parseBody(req);
193
+ try {
194
+ if (segments[0] === 'api') {
195
+ const resource = segments[1];
196
+ // Health
197
+ if (pathname === '/api/health' || pathname === '/api') {
198
+ sendJson(res, 200, { success: true, data: { status: 'ok', mode: 'rest' }, timestamp: new Date().toISOString() });
199
+ return;
200
+ }
201
+ // Tools
202
+ if (resource === 'tools' && !segments[2] && req.method === 'GET') {
203
+ const tools = this.restAdapter.getToolDefinitions().map(t => ({ name: t.name, description: t.description }));
204
+ sendJson(res, 200, { success: true, data: { tools }, timestamp: new Date().toISOString() });
205
+ return;
206
+ }
207
+ if (resource === 'tools' && segments[2] && req.method === 'POST') {
208
+ const result = await this.restAdapter.callTool(segments[2], body);
209
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
210
+ return;
211
+ }
212
+ // Variables
213
+ if (resource === 'variables') {
214
+ if (!segments[2] && req.method === 'GET') {
215
+ const result = await this.restAdapter.callTool('envcp_list', {});
216
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
217
+ return;
218
+ }
219
+ if (!segments[2] && req.method === 'POST') {
220
+ const result = await this.restAdapter.callTool('envcp_set', body);
221
+ sendJson(res, 201, { success: true, data: result, timestamp: new Date().toISOString() });
222
+ return;
223
+ }
224
+ if (segments[2] && req.method === 'GET') {
225
+ const result = await this.restAdapter.callTool('envcp_get', { name: segments[2], show_value: parsedUrl.query.show_value === 'true' });
226
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
227
+ return;
228
+ }
229
+ if (segments[2] && req.method === 'PUT') {
230
+ const result = await this.restAdapter.callTool('envcp_set', { ...body, name: segments[2] });
231
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
232
+ return;
233
+ }
234
+ if (segments[2] && req.method === 'DELETE') {
235
+ const result = await this.restAdapter.callTool('envcp_delete', { name: segments[2] });
236
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
237
+ return;
238
+ }
239
+ }
240
+ // Sync
241
+ if (resource === 'sync' && req.method === 'POST') {
242
+ const result = await this.restAdapter.callTool('envcp_sync', {});
243
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
244
+ return;
245
+ }
246
+ // Run
247
+ if (resource === 'run' && req.method === 'POST') {
248
+ const result = await this.restAdapter.callTool('envcp_run', body);
249
+ sendJson(res, 200, { success: true, data: result, timestamp: new Date().toISOString() });
250
+ return;
251
+ }
252
+ }
253
+ sendJson(res, 404, { success: false, error: 'Not found', timestamp: new Date().toISOString() });
254
+ }
255
+ catch (error) {
256
+ sendJson(res, 500, { success: false, error: error.message, timestamp: new Date().toISOString() });
257
+ }
258
+ }
259
+ async handleOpenAIRequest(req, res) {
260
+ if (!this.openaiAdapter) {
261
+ sendJson(res, 503, { error: { message: 'OpenAI adapter not initialized', type: 'service_unavailable' } });
262
+ return;
263
+ }
264
+ const parsedUrl = url.parse(req.url || '/', true);
265
+ const pathname = parsedUrl.pathname || '/';
266
+ const body = await parseBody(req);
267
+ try {
268
+ if (pathname === '/v1/models' && req.method === 'GET') {
269
+ sendJson(res, 200, {
270
+ object: 'list',
271
+ data: [{ id: 'envcp-1.0', object: 'model', created: Date.now(), owned_by: 'envcp' }],
272
+ });
273
+ return;
274
+ }
275
+ if (pathname === '/v1/functions' && req.method === 'GET') {
276
+ sendJson(res, 200, { object: 'list', data: this.openaiAdapter.getOpenAIFunctions() });
277
+ return;
278
+ }
279
+ if (pathname === '/v1/functions/call' && req.method === 'POST') {
280
+ const { name, arguments: args } = body;
281
+ const result = await this.openaiAdapter.callTool(name, args || {});
282
+ sendJson(res, 200, { object: 'function_result', name, result });
283
+ return;
284
+ }
285
+ if (pathname === '/v1/tool_calls' && req.method === 'POST') {
286
+ const { tool_calls } = body;
287
+ const results = await this.openaiAdapter.processToolCalls(tool_calls);
288
+ sendJson(res, 200, { object: 'list', data: results });
289
+ return;
290
+ }
291
+ if (pathname === '/v1/chat/completions' && req.method === 'POST') {
292
+ const messages = body.messages;
293
+ const lastMessage = messages?.[messages.length - 1];
294
+ if (lastMessage?.tool_calls) {
295
+ const results = await this.openaiAdapter.processToolCalls(lastMessage.tool_calls);
296
+ sendJson(res, 200, {
297
+ id: `chatcmpl-${Date.now()}`,
298
+ object: 'chat.completion',
299
+ model: 'envcp-1.0',
300
+ choices: [{ index: 0, message: { role: 'assistant', content: null }, finish_reason: 'tool_calls' }],
301
+ tool_results: results,
302
+ });
303
+ return;
304
+ }
305
+ sendJson(res, 200, {
306
+ id: `chatcmpl-${Date.now()}`,
307
+ object: 'chat.completion',
308
+ model: 'envcp-1.0',
309
+ choices: [{ index: 0, message: { role: 'assistant', content: 'EnvCP tools available.' }, finish_reason: 'stop' }],
310
+ available_tools: this.openaiAdapter.getOpenAIFunctions().map(f => ({ type: 'function', function: f })),
311
+ });
312
+ return;
313
+ }
314
+ sendJson(res, 404, { error: { message: 'Not found', type: 'not_found' } });
315
+ }
316
+ catch (error) {
317
+ sendJson(res, 500, { error: { message: error.message, type: 'internal_error' } });
318
+ }
319
+ }
320
+ async handleGeminiRequest(req, res) {
321
+ if (!this.geminiAdapter) {
322
+ sendJson(res, 503, { error: { code: 503, message: 'Gemini adapter not initialized', status: 'UNAVAILABLE' } });
323
+ return;
324
+ }
325
+ const parsedUrl = url.parse(req.url || '/', true);
326
+ const pathname = parsedUrl.pathname || '/';
327
+ const body = await parseBody(req);
328
+ try {
329
+ if (pathname === '/v1/tools' && req.method === 'GET') {
330
+ sendJson(res, 200, { tools: [{ functionDeclarations: this.geminiAdapter.getGeminiFunctionDeclarations() }] });
331
+ return;
332
+ }
333
+ if (pathname === '/v1/functions/call' && req.method === 'POST') {
334
+ const { name, args } = body;
335
+ const result = await this.geminiAdapter.callTool(name, args || {});
336
+ sendJson(res, 200, { name, response: { result } });
337
+ return;
338
+ }
339
+ if (pathname === '/v1/function_calls' && req.method === 'POST') {
340
+ const { functionCalls } = body;
341
+ const results = await this.geminiAdapter.processFunctionCalls(functionCalls);
342
+ sendJson(res, 200, { functionResponses: results });
343
+ return;
344
+ }
345
+ if (pathname.includes(':generateContent') && req.method === 'POST') {
346
+ const contents = body.contents;
347
+ const functionCalls = [];
348
+ if (contents) {
349
+ for (const content of contents) {
350
+ for (const part of content.parts || []) {
351
+ if (part.functionCall)
352
+ functionCalls.push(part.functionCall);
353
+ }
354
+ }
355
+ }
356
+ if (functionCalls.length > 0) {
357
+ const results = await this.geminiAdapter.processFunctionCalls(functionCalls);
358
+ sendJson(res, 200, {
359
+ candidates: [{
360
+ content: { parts: results.map(r => ({ functionResponse: r })), role: 'model' },
361
+ finishReason: 'STOP',
362
+ }],
363
+ });
364
+ return;
365
+ }
366
+ sendJson(res, 200, {
367
+ candidates: [{
368
+ content: { parts: [{ text: 'EnvCP tools available.' }], role: 'model' },
369
+ finishReason: 'STOP',
370
+ }],
371
+ availableTools: [{ functionDeclarations: this.geminiAdapter.getGeminiFunctionDeclarations() }],
372
+ });
373
+ return;
374
+ }
375
+ sendJson(res, 404, { error: { code: 404, message: 'Not found', status: 'NOT_FOUND' } });
376
+ }
377
+ catch (error) {
378
+ sendJson(res, 500, { error: { code: 500, message: error.message, status: 'INTERNAL' } });
379
+ }
380
+ }
381
+ stop() {
382
+ if (this.httpServer) {
383
+ this.httpServer.close();
384
+ this.httpServer = null;
385
+ }
386
+ if (this.restAdapter) {
387
+ this.restAdapter.stopServer();
388
+ }
389
+ if (this.openaiAdapter) {
390
+ this.openaiAdapter.stopServer();
391
+ }
392
+ if (this.geminiAdapter) {
393
+ this.geminiAdapter.stopServer();
394
+ }
395
+ }
396
+ }
397
+ //# sourceMappingURL=unified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../src/server/unified.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Variable, OperationLog } from '../types.js';
2
+ export declare class StorageManager {
3
+ private storePath;
4
+ private encrypted;
5
+ private password?;
6
+ constructor(storePath: string, encrypted?: boolean);
7
+ setPassword(password: string): void;
8
+ load(): Promise<Record<string, Variable>>;
9
+ save(variables: Record<string, Variable>): Promise<void>;
10
+ get(name: string): Promise<Variable | undefined>;
11
+ set(name: string, variable: Variable): Promise<void>;
12
+ delete(name: string): Promise<boolean>;
13
+ list(): Promise<string[]>;
14
+ exists(): Promise<boolean>;
15
+ }
16
+ export declare class LogManager {
17
+ private logDir;
18
+ constructor(logDir: string);
19
+ init(): Promise<void>;
20
+ log(entry: OperationLog): Promise<void>;
21
+ getLogs(date?: string): Promise<OperationLog[]>;
22
+ }
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrD,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc;IAKxD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAmBzC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAKhD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAGjC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAWtD"}
@@ -0,0 +1,92 @@
1
+ import * as fs from 'fs-extra';
2
+ import * as path from 'path';
3
+ import { encrypt, decrypt } from '../utils/crypto.js';
4
+ export class StorageManager {
5
+ storePath;
6
+ encrypted;
7
+ password;
8
+ constructor(storePath, encrypted = true) {
9
+ this.storePath = storePath;
10
+ this.encrypted = encrypted;
11
+ }
12
+ setPassword(password) {
13
+ this.password = password;
14
+ }
15
+ async load() {
16
+ if (!await fs.pathExists(this.storePath)) {
17
+ return {};
18
+ }
19
+ const data = await fs.readFile(this.storePath, 'utf8');
20
+ if (this.encrypted && this.password) {
21
+ try {
22
+ const decrypted = decrypt(data, this.password);
23
+ return JSON.parse(decrypted);
24
+ }
25
+ catch (error) {
26
+ throw new Error('Failed to decrypt storage. Invalid password or corrupted data.');
27
+ }
28
+ }
29
+ return JSON.parse(data);
30
+ }
31
+ async save(variables) {
32
+ const data = JSON.stringify(variables, null, 2);
33
+ await fs.ensureDir(path.dirname(this.storePath));
34
+ if (this.encrypted && this.password) {
35
+ const encryptedData = encrypt(data, this.password);
36
+ await fs.writeFile(this.storePath, encryptedData, 'utf8');
37
+ }
38
+ else {
39
+ await fs.writeFile(this.storePath, data, 'utf8');
40
+ }
41
+ }
42
+ async get(name) {
43
+ const variables = await this.load();
44
+ return variables[name];
45
+ }
46
+ async set(name, variable) {
47
+ const variables = await this.load();
48
+ variables[name] = variable;
49
+ await this.save(variables);
50
+ }
51
+ async delete(name) {
52
+ const variables = await this.load();
53
+ if (variables[name]) {
54
+ delete variables[name];
55
+ await this.save(variables);
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ async list() {
61
+ const variables = await this.load();
62
+ return Object.keys(variables);
63
+ }
64
+ async exists() {
65
+ return fs.pathExists(this.storePath);
66
+ }
67
+ }
68
+ export class LogManager {
69
+ logDir;
70
+ constructor(logDir) {
71
+ this.logDir = logDir;
72
+ }
73
+ async init() {
74
+ await fs.ensureDir(this.logDir);
75
+ }
76
+ async log(entry) {
77
+ const date = new Date().toISOString().split('T')[0];
78
+ const logFile = path.join(this.logDir, `operations-${date}.log`);
79
+ const logLine = JSON.stringify(entry) + '\n';
80
+ await fs.appendFile(logFile, logLine);
81
+ }
82
+ async getLogs(date) {
83
+ const logDate = date || new Date().toISOString().split('T')[0];
84
+ const logFile = path.join(this.logDir, `operations-${logDate}.log`);
85
+ if (!await fs.pathExists(logFile)) {
86
+ return [];
87
+ }
88
+ const content = await fs.readFile(logFile, 'utf8');
89
+ return content.trim().split('\n').map(line => JSON.parse(line));
90
+ }
91
+ }
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}