@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,404 @@
1
+ import { z } from 'zod';
2
+ export declare const EnvCPConfigSchema: z.ZodObject<{
3
+ version: z.ZodDefault<z.ZodString>;
4
+ project: z.ZodOptional<z.ZodString>;
5
+ storage: z.ZodDefault<z.ZodObject<{
6
+ path: z.ZodDefault<z.ZodString>;
7
+ encrypted: z.ZodDefault<z.ZodBoolean>;
8
+ algorithm: z.ZodDefault<z.ZodEnum<["aes-256-gcm", "aes-256-cbc"]>>;
9
+ compression: z.ZodDefault<z.ZodBoolean>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ path: string;
12
+ encrypted: boolean;
13
+ algorithm: "aes-256-gcm" | "aes-256-cbc";
14
+ compression: boolean;
15
+ }, {
16
+ path?: string | undefined;
17
+ encrypted?: boolean | undefined;
18
+ algorithm?: "aes-256-gcm" | "aes-256-cbc" | undefined;
19
+ compression?: boolean | undefined;
20
+ }>>;
21
+ access: z.ZodDefault<z.ZodObject<{
22
+ allow_ai_read: z.ZodDefault<z.ZodBoolean>;
23
+ allow_ai_write: z.ZodDefault<z.ZodBoolean>;
24
+ allow_ai_delete: z.ZodDefault<z.ZodBoolean>;
25
+ allow_ai_export: z.ZodDefault<z.ZodBoolean>;
26
+ allow_ai_active_check: z.ZodDefault<z.ZodBoolean>;
27
+ require_user_reference: z.ZodDefault<z.ZodBoolean>;
28
+ require_confirmation: z.ZodDefault<z.ZodBoolean>;
29
+ mask_values: z.ZodDefault<z.ZodBoolean>;
30
+ audit_log: z.ZodDefault<z.ZodBoolean>;
31
+ allowed_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
32
+ denied_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
33
+ blacklist_patterns: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ allow_ai_read: boolean;
36
+ allow_ai_write: boolean;
37
+ allow_ai_delete: boolean;
38
+ allow_ai_export: boolean;
39
+ allow_ai_active_check: boolean;
40
+ require_user_reference: boolean;
41
+ require_confirmation: boolean;
42
+ mask_values: boolean;
43
+ audit_log: boolean;
44
+ blacklist_patterns: string[];
45
+ allowed_patterns?: string[] | undefined;
46
+ denied_patterns?: string[] | undefined;
47
+ }, {
48
+ allow_ai_read?: boolean | undefined;
49
+ allow_ai_write?: boolean | undefined;
50
+ allow_ai_delete?: boolean | undefined;
51
+ allow_ai_export?: boolean | undefined;
52
+ allow_ai_active_check?: boolean | undefined;
53
+ require_user_reference?: boolean | undefined;
54
+ require_confirmation?: boolean | undefined;
55
+ mask_values?: boolean | undefined;
56
+ audit_log?: boolean | undefined;
57
+ allowed_patterns?: string[] | undefined;
58
+ denied_patterns?: string[] | undefined;
59
+ blacklist_patterns?: string[] | undefined;
60
+ }>>;
61
+ sync: z.ZodDefault<z.ZodObject<{
62
+ enabled: z.ZodDefault<z.ZodBoolean>;
63
+ target: z.ZodDefault<z.ZodString>;
64
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
65
+ include: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
66
+ format: z.ZodDefault<z.ZodEnum<["dotenv", "json", "yaml"]>>;
67
+ header: z.ZodOptional<z.ZodString>;
68
+ }, "strip", z.ZodTypeAny, {
69
+ enabled: boolean;
70
+ target: string;
71
+ exclude: string[];
72
+ format: "dotenv" | "json" | "yaml";
73
+ include?: string[] | undefined;
74
+ header?: string | undefined;
75
+ }, {
76
+ enabled?: boolean | undefined;
77
+ target?: string | undefined;
78
+ exclude?: string[] | undefined;
79
+ include?: string[] | undefined;
80
+ format?: "dotenv" | "json" | "yaml" | undefined;
81
+ header?: string | undefined;
82
+ }>>;
83
+ session: z.ZodDefault<z.ZodObject<{
84
+ enabled: z.ZodDefault<z.ZodBoolean>;
85
+ timeout_minutes: z.ZodDefault<z.ZodNumber>;
86
+ max_extensions: z.ZodDefault<z.ZodNumber>;
87
+ path: z.ZodDefault<z.ZodString>;
88
+ }, "strip", z.ZodTypeAny, {
89
+ path: string;
90
+ enabled: boolean;
91
+ timeout_minutes: number;
92
+ max_extensions: number;
93
+ }, {
94
+ path?: string | undefined;
95
+ enabled?: boolean | undefined;
96
+ timeout_minutes?: number | undefined;
97
+ max_extensions?: number | undefined;
98
+ }>>;
99
+ password: z.ZodDefault<z.ZodObject<{
100
+ min_length: z.ZodDefault<z.ZodNumber>;
101
+ require_complexity: z.ZodDefault<z.ZodBoolean>;
102
+ allow_numeric_only: z.ZodDefault<z.ZodBoolean>;
103
+ allow_single_char: z.ZodDefault<z.ZodBoolean>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ min_length: number;
106
+ require_complexity: boolean;
107
+ allow_numeric_only: boolean;
108
+ allow_single_char: boolean;
109
+ }, {
110
+ min_length?: number | undefined;
111
+ require_complexity?: boolean | undefined;
112
+ allow_numeric_only?: boolean | undefined;
113
+ allow_single_char?: boolean | undefined;
114
+ }>>;
115
+ variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
116
+ value: z.ZodString;
117
+ encrypted: z.ZodDefault<z.ZodBoolean>;
118
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
119
+ description: z.ZodOptional<z.ZodString>;
120
+ created: z.ZodOptional<z.ZodString>;
121
+ updated: z.ZodOptional<z.ZodString>;
122
+ accessed: z.ZodOptional<z.ZodString>;
123
+ sync_to_env: z.ZodDefault<z.ZodBoolean>;
124
+ }, "strip", z.ZodTypeAny, {
125
+ encrypted: boolean;
126
+ value: string;
127
+ sync_to_env: boolean;
128
+ tags?: string[] | undefined;
129
+ description?: string | undefined;
130
+ created?: string | undefined;
131
+ updated?: string | undefined;
132
+ accessed?: string | undefined;
133
+ }, {
134
+ value: string;
135
+ encrypted?: boolean | undefined;
136
+ tags?: string[] | undefined;
137
+ description?: string | undefined;
138
+ created?: string | undefined;
139
+ updated?: string | undefined;
140
+ accessed?: string | undefined;
141
+ sync_to_env?: boolean | undefined;
142
+ }>>>;
143
+ }, "strip", z.ZodTypeAny, {
144
+ version: string;
145
+ storage: {
146
+ path: string;
147
+ encrypted: boolean;
148
+ algorithm: "aes-256-gcm" | "aes-256-cbc";
149
+ compression: boolean;
150
+ };
151
+ access: {
152
+ allow_ai_read: boolean;
153
+ allow_ai_write: boolean;
154
+ allow_ai_delete: boolean;
155
+ allow_ai_export: boolean;
156
+ allow_ai_active_check: boolean;
157
+ require_user_reference: boolean;
158
+ require_confirmation: boolean;
159
+ mask_values: boolean;
160
+ audit_log: boolean;
161
+ blacklist_patterns: string[];
162
+ allowed_patterns?: string[] | undefined;
163
+ denied_patterns?: string[] | undefined;
164
+ };
165
+ sync: {
166
+ enabled: boolean;
167
+ target: string;
168
+ exclude: string[];
169
+ format: "dotenv" | "json" | "yaml";
170
+ include?: string[] | undefined;
171
+ header?: string | undefined;
172
+ };
173
+ session: {
174
+ path: string;
175
+ enabled: boolean;
176
+ timeout_minutes: number;
177
+ max_extensions: number;
178
+ };
179
+ password: {
180
+ min_length: number;
181
+ require_complexity: boolean;
182
+ allow_numeric_only: boolean;
183
+ allow_single_char: boolean;
184
+ };
185
+ project?: string | undefined;
186
+ variables?: Record<string, {
187
+ encrypted: boolean;
188
+ value: string;
189
+ sync_to_env: boolean;
190
+ tags?: string[] | undefined;
191
+ description?: string | undefined;
192
+ created?: string | undefined;
193
+ updated?: string | undefined;
194
+ accessed?: string | undefined;
195
+ }> | undefined;
196
+ }, {
197
+ version?: string | undefined;
198
+ project?: string | undefined;
199
+ storage?: {
200
+ path?: string | undefined;
201
+ encrypted?: boolean | undefined;
202
+ algorithm?: "aes-256-gcm" | "aes-256-cbc" | undefined;
203
+ compression?: boolean | undefined;
204
+ } | undefined;
205
+ access?: {
206
+ allow_ai_read?: boolean | undefined;
207
+ allow_ai_write?: boolean | undefined;
208
+ allow_ai_delete?: boolean | undefined;
209
+ allow_ai_export?: boolean | undefined;
210
+ allow_ai_active_check?: boolean | undefined;
211
+ require_user_reference?: boolean | undefined;
212
+ require_confirmation?: boolean | undefined;
213
+ mask_values?: boolean | undefined;
214
+ audit_log?: boolean | undefined;
215
+ allowed_patterns?: string[] | undefined;
216
+ denied_patterns?: string[] | undefined;
217
+ blacklist_patterns?: string[] | undefined;
218
+ } | undefined;
219
+ sync?: {
220
+ enabled?: boolean | undefined;
221
+ target?: string | undefined;
222
+ exclude?: string[] | undefined;
223
+ include?: string[] | undefined;
224
+ format?: "dotenv" | "json" | "yaml" | undefined;
225
+ header?: string | undefined;
226
+ } | undefined;
227
+ session?: {
228
+ path?: string | undefined;
229
+ enabled?: boolean | undefined;
230
+ timeout_minutes?: number | undefined;
231
+ max_extensions?: number | undefined;
232
+ } | undefined;
233
+ password?: {
234
+ min_length?: number | undefined;
235
+ require_complexity?: boolean | undefined;
236
+ allow_numeric_only?: boolean | undefined;
237
+ allow_single_char?: boolean | undefined;
238
+ } | undefined;
239
+ variables?: Record<string, {
240
+ value: string;
241
+ encrypted?: boolean | undefined;
242
+ tags?: string[] | undefined;
243
+ description?: string | undefined;
244
+ created?: string | undefined;
245
+ updated?: string | undefined;
246
+ accessed?: string | undefined;
247
+ sync_to_env?: boolean | undefined;
248
+ }> | undefined;
249
+ }>;
250
+ export type EnvCPConfig = z.infer<typeof EnvCPConfigSchema>;
251
+ export declare const VariableSchema: z.ZodObject<{
252
+ name: z.ZodString;
253
+ value: z.ZodString;
254
+ encrypted: z.ZodDefault<z.ZodBoolean>;
255
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
256
+ description: z.ZodOptional<z.ZodString>;
257
+ created: z.ZodString;
258
+ updated: z.ZodString;
259
+ accessed: z.ZodOptional<z.ZodString>;
260
+ sync_to_env: z.ZodDefault<z.ZodBoolean>;
261
+ }, "strip", z.ZodTypeAny, {
262
+ encrypted: boolean;
263
+ value: string;
264
+ created: string;
265
+ updated: string;
266
+ sync_to_env: boolean;
267
+ name: string;
268
+ tags?: string[] | undefined;
269
+ description?: string | undefined;
270
+ accessed?: string | undefined;
271
+ }, {
272
+ value: string;
273
+ created: string;
274
+ updated: string;
275
+ name: string;
276
+ encrypted?: boolean | undefined;
277
+ tags?: string[] | undefined;
278
+ description?: string | undefined;
279
+ accessed?: string | undefined;
280
+ sync_to_env?: boolean | undefined;
281
+ }>;
282
+ export type Variable = z.infer<typeof VariableSchema>;
283
+ export declare const OperationLogSchema: z.ZodObject<{
284
+ timestamp: z.ZodString;
285
+ operation: z.ZodEnum<["add", "get", "update", "delete", "list", "sync", "export", "unlock", "lock", "check_access"]>;
286
+ variable: z.ZodOptional<z.ZodString>;
287
+ source: z.ZodEnum<["cli", "mcp", "api"]>;
288
+ success: z.ZodBoolean;
289
+ message: z.ZodOptional<z.ZodString>;
290
+ }, "strip", z.ZodTypeAny, {
291
+ timestamp: string;
292
+ operation: "sync" | "add" | "get" | "update" | "delete" | "list" | "export" | "unlock" | "lock" | "check_access";
293
+ source: "cli" | "mcp" | "api";
294
+ success: boolean;
295
+ message?: string | undefined;
296
+ variable?: string | undefined;
297
+ }, {
298
+ timestamp: string;
299
+ operation: "sync" | "add" | "get" | "update" | "delete" | "list" | "export" | "unlock" | "lock" | "check_access";
300
+ source: "cli" | "mcp" | "api";
301
+ success: boolean;
302
+ message?: string | undefined;
303
+ variable?: string | undefined;
304
+ }>;
305
+ export type OperationLog = z.infer<typeof OperationLogSchema>;
306
+ export declare const SessionSchema: z.ZodObject<{
307
+ id: z.ZodString;
308
+ created: z.ZodString;
309
+ expires: z.ZodString;
310
+ extensions: z.ZodDefault<z.ZodNumber>;
311
+ last_access: z.ZodString;
312
+ }, "strip", z.ZodTypeAny, {
313
+ created: string;
314
+ id: string;
315
+ expires: string;
316
+ extensions: number;
317
+ last_access: string;
318
+ }, {
319
+ created: string;
320
+ id: string;
321
+ expires: string;
322
+ last_access: string;
323
+ extensions?: number | undefined;
324
+ }>;
325
+ export type Session = z.infer<typeof SessionSchema>;
326
+ export declare const ServerModeSchema: z.ZodEnum<["mcp", "rest", "openai", "gemini", "all", "auto"]>;
327
+ export type ServerMode = z.infer<typeof ServerModeSchema>;
328
+ export declare const ServerConfigSchema: z.ZodObject<{
329
+ mode: z.ZodDefault<z.ZodEnum<["mcp", "rest", "openai", "gemini", "all", "auto"]>>;
330
+ port: z.ZodDefault<z.ZodNumber>;
331
+ host: z.ZodDefault<z.ZodString>;
332
+ cors: z.ZodDefault<z.ZodBoolean>;
333
+ api_key: z.ZodOptional<z.ZodString>;
334
+ auto_detect: z.ZodDefault<z.ZodBoolean>;
335
+ }, "strip", z.ZodTypeAny, {
336
+ mode: "mcp" | "rest" | "openai" | "gemini" | "all" | "auto";
337
+ port: number;
338
+ host: string;
339
+ cors: boolean;
340
+ auto_detect: boolean;
341
+ api_key?: string | undefined;
342
+ }, {
343
+ mode?: "mcp" | "rest" | "openai" | "gemini" | "all" | "auto" | undefined;
344
+ port?: number | undefined;
345
+ host?: string | undefined;
346
+ cors?: boolean | undefined;
347
+ api_key?: string | undefined;
348
+ auto_detect?: boolean | undefined;
349
+ }>;
350
+ export type ServerConfig = z.infer<typeof ServerConfigSchema>;
351
+ export interface ToolDefinition {
352
+ name: string;
353
+ description: string;
354
+ parameters: Record<string, unknown>;
355
+ handler: (params: Record<string, unknown>) => Promise<unknown>;
356
+ }
357
+ export interface OpenAIFunction {
358
+ name: string;
359
+ description: string;
360
+ parameters: {
361
+ type: 'object';
362
+ properties: Record<string, unknown>;
363
+ required?: string[];
364
+ };
365
+ }
366
+ export interface OpenAIToolCall {
367
+ id: string;
368
+ type: 'function';
369
+ function: {
370
+ name: string;
371
+ arguments: string;
372
+ };
373
+ }
374
+ export interface OpenAIMessage {
375
+ role: 'system' | 'user' | 'assistant' | 'tool';
376
+ content: string | null;
377
+ tool_calls?: OpenAIToolCall[];
378
+ tool_call_id?: string;
379
+ }
380
+ export interface GeminiFunctionDeclaration {
381
+ name: string;
382
+ description: string;
383
+ parameters: {
384
+ type: 'object';
385
+ properties: Record<string, unknown>;
386
+ required?: string[];
387
+ };
388
+ }
389
+ export interface GeminiFunctionCall {
390
+ name: string;
391
+ args: Record<string, unknown>;
392
+ }
393
+ export interface GeminiFunctionResponse {
394
+ name: string;
395
+ response: Record<string, unknown>;
396
+ }
397
+ export interface RESTResponse<T = unknown> {
398
+ success: boolean;
399
+ data?: T;
400
+ error?: string;
401
+ timestamp: string;
402
+ }
403
+ export type ClientType = 'mcp' | 'openai' | 'gemini' | 'rest' | 'unknown';
404
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,92 @@
1
+ import { z } from 'zod';
2
+ export const EnvCPConfigSchema = z.object({
3
+ version: z.string().default('1.0'),
4
+ project: z.string().optional(),
5
+ storage: z.object({
6
+ path: z.string().default('.envcp/store.enc'),
7
+ encrypted: z.boolean().default(true),
8
+ algorithm: z.enum(['aes-256-gcm', 'aes-256-cbc']).default('aes-256-gcm'),
9
+ compression: z.boolean().default(false),
10
+ }).default({}),
11
+ access: z.object({
12
+ allow_ai_read: z.boolean().default(false),
13
+ allow_ai_write: z.boolean().default(false),
14
+ allow_ai_delete: z.boolean().default(false),
15
+ allow_ai_export: z.boolean().default(false),
16
+ allow_ai_active_check: z.boolean().default(false),
17
+ require_user_reference: z.boolean().default(true),
18
+ require_confirmation: z.boolean().default(true),
19
+ mask_values: z.boolean().default(true),
20
+ audit_log: z.boolean().default(true),
21
+ allowed_patterns: z.array(z.string()).optional(),
22
+ denied_patterns: z.array(z.string()).optional(),
23
+ blacklist_patterns: z.array(z.string()).default([]),
24
+ }).default({}),
25
+ sync: z.object({
26
+ enabled: z.boolean().default(false),
27
+ target: z.string().default('.env'),
28
+ exclude: z.array(z.string()).default([]),
29
+ include: z.array(z.string()).optional(),
30
+ format: z.enum(['dotenv', 'json', 'yaml']).default('dotenv'),
31
+ header: z.string().optional(),
32
+ }).default({}),
33
+ session: z.object({
34
+ enabled: z.boolean().default(true),
35
+ timeout_minutes: z.number().default(30),
36
+ max_extensions: z.number().default(5),
37
+ path: z.string().default('.envcp/.session'),
38
+ }).default({}),
39
+ password: z.object({
40
+ min_length: z.number().default(1),
41
+ require_complexity: z.boolean().default(false),
42
+ allow_numeric_only: z.boolean().default(true),
43
+ allow_single_char: z.boolean().default(true),
44
+ }).default({}),
45
+ variables: z.record(z.object({
46
+ value: z.string(),
47
+ encrypted: z.boolean().default(false),
48
+ tags: z.array(z.string()).optional(),
49
+ description: z.string().optional(),
50
+ created: z.string().optional(),
51
+ updated: z.string().optional(),
52
+ accessed: z.string().optional(),
53
+ sync_to_env: z.boolean().default(true),
54
+ })).optional(),
55
+ });
56
+ export const VariableSchema = z.object({
57
+ name: z.string(),
58
+ value: z.string(),
59
+ encrypted: z.boolean().default(false),
60
+ tags: z.array(z.string()).optional(),
61
+ description: z.string().optional(),
62
+ created: z.string(),
63
+ updated: z.string(),
64
+ accessed: z.string().optional(),
65
+ sync_to_env: z.boolean().default(true),
66
+ });
67
+ export const OperationLogSchema = z.object({
68
+ timestamp: z.string(),
69
+ operation: z.enum(['add', 'get', 'update', 'delete', 'list', 'sync', 'export', 'unlock', 'lock', 'check_access']),
70
+ variable: z.string().optional(),
71
+ source: z.enum(['cli', 'mcp', 'api']),
72
+ success: z.boolean(),
73
+ message: z.string().optional(),
74
+ });
75
+ export const SessionSchema = z.object({
76
+ id: z.string(),
77
+ created: z.string(),
78
+ expires: z.string(),
79
+ extensions: z.number().default(0),
80
+ last_access: z.string(),
81
+ });
82
+ // Server mode types
83
+ export const ServerModeSchema = z.enum(['mcp', 'rest', 'openai', 'gemini', 'all', 'auto']);
84
+ export const ServerConfigSchema = z.object({
85
+ mode: ServerModeSchema.default('auto'),
86
+ port: z.number().default(3456),
87
+ host: z.string().default('127.0.0.1'),
88
+ cors: z.boolean().default(true),
89
+ api_key: z.string().optional(),
90
+ auto_detect: z.boolean().default(true),
91
+ });
92
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function deriveKey(password: string, salt: Buffer): Buffer;
2
+ export declare function encrypt(text: string, password: string): string;
3
+ export declare function decrypt(encryptedData: string, password: string): string;
4
+ export declare function generateId(): string;
5
+ export declare function generateSessionToken(): string;
6
+ export declare function maskValue(value: string, showLength?: number): string;
7
+ export declare function validatePassword(password: string, config: {
8
+ min_length?: number;
9
+ require_complexity?: boolean;
10
+ allow_numeric_only?: boolean;
11
+ allow_single_char?: boolean;
12
+ }): {
13
+ valid: boolean;
14
+ error?: string;
15
+ };
16
+ export declare function quickHash(input: string): string;
17
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAevE;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,MAAM,CAKvE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCrC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,73 @@
1
+ import * as crypto from 'crypto';
2
+ const ALGORITHM = 'aes-256-gcm';
3
+ const IV_LENGTH = 16;
4
+ const AUTH_TAG_LENGTH = 16;
5
+ const SALT_LENGTH = 64;
6
+ const ITERATIONS = 100000;
7
+ export function deriveKey(password, salt) {
8
+ return crypto.pbkdf2Sync(password, salt, ITERATIONS, 32, 'sha512');
9
+ }
10
+ export function encrypt(text, password) {
11
+ const salt = crypto.randomBytes(SALT_LENGTH);
12
+ const key = deriveKey(password, salt);
13
+ const iv = crypto.randomBytes(IV_LENGTH);
14
+ const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
15
+ let encrypted = cipher.update(text, 'utf8', 'hex');
16
+ encrypted += cipher.final('hex');
17
+ const authTag = cipher.getAuthTag();
18
+ return salt.toString('hex') + iv.toString('hex') + authTag.toString('hex') + encrypted;
19
+ }
20
+ export function decrypt(encryptedData, password) {
21
+ const salt = Buffer.from(encryptedData.slice(0, SALT_LENGTH * 2), 'hex');
22
+ const iv = Buffer.from(encryptedData.slice(SALT_LENGTH * 2, SALT_LENGTH * 2 + IV_LENGTH * 2), 'hex');
23
+ const authTag = Buffer.from(encryptedData.slice(SALT_LENGTH * 2 + IV_LENGTH * 2, SALT_LENGTH * 2 + IV_LENGTH * 2 + AUTH_TAG_LENGTH * 2), 'hex');
24
+ const encrypted = encryptedData.slice(SALT_LENGTH * 2 + IV_LENGTH * 2 + AUTH_TAG_LENGTH * 2);
25
+ const key = deriveKey(password, salt);
26
+ const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
27
+ decipher.setAuthTag(authTag);
28
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
29
+ decrypted += decipher.final('utf8');
30
+ return decrypted;
31
+ }
32
+ export function generateId() {
33
+ return crypto.randomBytes(16).toString('hex');
34
+ }
35
+ export function generateSessionToken() {
36
+ return crypto.randomBytes(32).toString('hex');
37
+ }
38
+ export function maskValue(value, showLength = 4) {
39
+ if (value.length <= showLength * 2) {
40
+ return '*'.repeat(value.length);
41
+ }
42
+ return value.slice(0, showLength) + '*'.repeat(value.length - showLength * 2) + value.slice(-showLength);
43
+ }
44
+ export function validatePassword(password, config) {
45
+ const minLength = config.min_length ?? 1;
46
+ const requireComplexity = config.require_complexity ?? false;
47
+ const allowNumericOnly = config.allow_numeric_only ?? true;
48
+ const allowSingleChar = config.allow_single_char ?? true;
49
+ if (password.length < minLength) {
50
+ return { valid: false, error: `Password must be at least ${minLength} character(s)` };
51
+ }
52
+ if (!allowSingleChar && password.length === 1) {
53
+ return { valid: false, error: 'Single character passwords are not allowed' };
54
+ }
55
+ if (!allowNumericOnly && /^\d+$/.test(password)) {
56
+ return { valid: false, error: 'Numeric-only passwords are not allowed' };
57
+ }
58
+ if (requireComplexity) {
59
+ const hasLower = /[a-z]/.test(password);
60
+ const hasUpper = /[A-Z]/.test(password);
61
+ const hasNumber = /[0-9]/.test(password);
62
+ const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(password);
63
+ const complexityCount = [hasLower, hasUpper, hasNumber, hasSpecial].filter(Boolean).length;
64
+ if (complexityCount < 3) {
65
+ return { valid: false, error: 'Password must contain at least 3 of: lowercase, uppercase, numbers, special characters' };
66
+ }
67
+ }
68
+ return { valid: true };
69
+ }
70
+ export function quickHash(input) {
71
+ return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);
72
+ }
73
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as http from 'http';
2
+ export declare function setCorsHeaders(res: http.ServerResponse, allowedOrigin?: string): void;
3
+ export declare function sendJson(res: http.ServerResponse, status: number, data: unknown): void;
4
+ export declare function parseBody(req: http.IncomingMessage): Promise<Record<string, unknown>>;
5
+ export declare function validateApiKey(provided: string | undefined, expected: string): boolean;
6
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,GAAE,MAAoB,GAAG,IAAI,CAIlG;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGtF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBrF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAItF"}
@@ -0,0 +1,43 @@
1
+ import * as crypto from 'crypto';
2
+ const MAX_BODY_SIZE = 1024 * 1024; // 1MB
3
+ export function setCorsHeaders(res, allowedOrigin = '127.0.0.1') {
4
+ res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
5
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
6
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key, X-Goog-Api-Key, OpenAI-Organization');
7
+ }
8
+ export function sendJson(res, status, data) {
9
+ res.writeHead(status, { 'Content-Type': 'application/json' });
10
+ res.end(JSON.stringify(data));
11
+ }
12
+ export function parseBody(req) {
13
+ return new Promise((resolve, reject) => {
14
+ let body = '';
15
+ let size = 0;
16
+ req.on('data', (chunk) => {
17
+ size += chunk.length;
18
+ if (size > MAX_BODY_SIZE) {
19
+ req.destroy();
20
+ reject(new Error('Request body too large'));
21
+ return;
22
+ }
23
+ body += chunk;
24
+ });
25
+ req.on('end', () => {
26
+ try {
27
+ resolve(body ? JSON.parse(body) : {});
28
+ }
29
+ catch {
30
+ reject(new Error('Invalid JSON body'));
31
+ }
32
+ });
33
+ req.on('error', reject);
34
+ });
35
+ }
36
+ export function validateApiKey(provided, expected) {
37
+ if (!provided)
38
+ return false;
39
+ if (provided.length !== expected.length)
40
+ return false;
41
+ return crypto.timingSafeEqual(Buffer.from(provided), Buffer.from(expected));
42
+ }
43
+ //# sourceMappingURL=http.js.map