@splashcodex/api-key-manager 4.1.0 → 5.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.
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Gemini Preset — One-line Gemini API key management
4
+ *
5
+ * Pre-configured singleton with:
6
+ * - Reads `GOOGLE_GEMINI_API_KEY` or `GEMINI_API_KEY` from env
7
+ * - LatencyStrategy for optimal key selection
8
+ * - File persistence (survives restarts)
9
+ * - Health checks every 5 minutes
10
+ * - Concurrency limit of 20
11
+ *
12
+ * @module presets/gemini
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { GeminiManager } from '@splashcodex/api-key-manager/presets/gemini';
17
+ *
18
+ * // Initialize once (reads keys from process.env automatically)
19
+ * const result = GeminiManager.getInstance();
20
+ * if (!result.success) throw result.error;
21
+ * const gemini = result.data;
22
+ *
23
+ * // Use the execute() wrapper for automatic key rotation + retries
24
+ * const response = await gemini.execute(async (key) => {
25
+ * const genAI = new GoogleGenerativeAI(key);
26
+ * const model = genAI.getGenerativeModel({ model: 'gemini-2.0-flash' });
27
+ * const res = await model.generateContent('Hello, world!');
28
+ * return res.response.text();
29
+ * }, { maxRetries: 3, timeoutMs: 30000 });
30
+ * ```
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.GeminiManager = void 0;
34
+ const base_1 = require("./base");
35
+ class GeminiManager extends base_1.BasePreset {
36
+ static PROVIDER = 'gemini';
37
+ constructor(keys, options) {
38
+ super(keys, options);
39
+ }
40
+ /**
41
+ * Default configuration for Gemini presets.
42
+ */
43
+ static getDefaultOptions() {
44
+ return {
45
+ envKeys: ['GOOGLE_GEMINI_API_KEY', 'GEMINI_API_KEY'],
46
+ provider: GeminiManager.PROVIDER,
47
+ concurrency: 20,
48
+ healthCheckIntervalMs: 300_000, // 5 minutes
49
+ };
50
+ }
51
+ /**
52
+ * Get or create the singleton GeminiManager instance.
53
+ *
54
+ * @param overrides - Optional configuration overrides
55
+ * @returns Result<GeminiManager> — safely check `.success` before using `.data`
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * const result = GeminiManager.getInstance();
60
+ * if (result.success) {
61
+ * const gemini = result.data;
62
+ * const text = await gemini.execute(apiCall, { maxRetries: 3 });
63
+ * }
64
+ * ```
65
+ */
66
+ static getInstance(overrides) {
67
+ return base_1.BasePreset.createInstance(GeminiManager, GeminiManager.getDefaultOptions(), overrides);
68
+ }
69
+ /**
70
+ * Reset the singleton instance. Primarily for testing.
71
+ */
72
+ static reset() {
73
+ base_1.BasePreset.resetInstance(GeminiManager.PROVIDER);
74
+ }
75
+ }
76
+ exports.GeminiManager = GeminiManager;
77
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/presets/gemini.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAEH,iCAA2D;AAE3D,MAAa,aAAc,SAAQ,iBAAU;IACjC,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC;IAE5C,YAAoB,IAAc,EAAE,OAAsB;QACtD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,iBAAiB;QAC5B,OAAO;YACH,OAAO,EAAE,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;YACpD,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,WAAW,EAAE,EAAE;YACf,qBAAqB,EAAE,OAAO,EAAE,YAAY;SAC/C,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,WAAW,CAAC,SAAkC;QACjD,OAAO,iBAAU,CAAC,cAAc,CAC5B,aAAyF,EACzF,aAAa,CAAC,iBAAiB,EAAE,EACjC,SAAS,CACa,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACR,iBAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;;AA/CL,sCAgDC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Presets — Batteries-included provider managers
3
+ * @module presets
4
+ */
5
+ export { BasePreset } from './base';
6
+ export type { PresetOptions, PresetLogger, Result } from './base';
7
+ export { GeminiManager } from './gemini';
8
+ export { OpenAIManager } from './openai';
9
+ export { MultiManager } from './multi';
10
+ export type { ProviderConfig, MultiManagerOptions } from './multi';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiManager = exports.OpenAIManager = exports.GeminiManager = exports.BasePreset = void 0;
4
+ /**
5
+ * Presets — Batteries-included provider managers
6
+ * @module presets
7
+ */
8
+ var base_1 = require("./base");
9
+ Object.defineProperty(exports, "BasePreset", { enumerable: true, get: function () { return base_1.BasePreset; } });
10
+ var gemini_1 = require("./gemini");
11
+ Object.defineProperty(exports, "GeminiManager", { enumerable: true, get: function () { return gemini_1.GeminiManager; } });
12
+ var openai_1 = require("./openai");
13
+ Object.defineProperty(exports, "OpenAIManager", { enumerable: true, get: function () { return openai_1.OpenAIManager; } });
14
+ var multi_1 = require("./multi");
15
+ Object.defineProperty(exports, "MultiManager", { enumerable: true, get: function () { return multi_1.MultiManager; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,+BAAoC;AAA3B,kGAAA,UAAU,OAAA;AAEnB,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,iCAAuC;AAA9B,qGAAA,YAAY,OAAA"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * MultiManager Preset — Multi-Provider Key Vault
3
+ *
4
+ * Manages API keys across multiple providers from a single entry point.
5
+ * Aggregates keys from multiple environment variables and routes
6
+ * requests to the correct provider pool.
7
+ *
8
+ * @module presets/multi
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { MultiManager } from '@splashcodex/api-key-manager/presets/multi';
13
+ *
14
+ * const result = MultiManager.getInstance({
15
+ * providers: {
16
+ * gemini: { envKeys: ['GOOGLE_GEMINI_API_KEY'] },
17
+ * openai: { envKeys: ['OPENAI_API_KEY'] },
18
+ * }
19
+ * });
20
+ *
21
+ * if (result.success) {
22
+ * const vault = result.data;
23
+ *
24
+ * // Route to specific provider
25
+ * const text = await vault.execute(async (key) => {
26
+ * // key is from the gemini pool
27
+ * return callGemini(key, prompt);
28
+ * }, { provider: 'gemini', maxRetries: 3 });
29
+ *
30
+ * // Get stats across all providers
31
+ * const stats = vault.getMultiStats();
32
+ * }
33
+ * ```
34
+ */
35
+ import { ApiKeyManager, ExecuteOptions, ApiKeyManagerStats, LoadBalancingStrategy, ApiKeyManagerOptions } from '../index';
36
+ export type Result<T> = {
37
+ success: true;
38
+ data: T;
39
+ } | {
40
+ success: false;
41
+ error: Error;
42
+ };
43
+ export interface ProviderConfig {
44
+ /** Environment variable names to read API keys from */
45
+ envKeys: string[];
46
+ /** Strategy override. Default: LatencyStrategy */
47
+ strategy?: LoadBalancingStrategy;
48
+ /** Concurrency limit. Default: 20 */
49
+ concurrency?: number;
50
+ /** Semantic cache configuration. Optional. */
51
+ semanticCache?: ApiKeyManagerOptions['semanticCache'];
52
+ }
53
+ export interface MultiManagerOptions {
54
+ /** Provider configurations keyed by name (e.g., 'gemini', 'openai') */
55
+ providers: Record<string, ProviderConfig>;
56
+ /** Health check interval in ms. Default: 300_000 (5 min). Set to 0 to disable. */
57
+ healthCheckIntervalMs?: number;
58
+ /** Custom logger. Defaults to console. */
59
+ logger?: {
60
+ info(msg: string, ...args: any[]): void;
61
+ warn(msg: string, ...args: any[]): void;
62
+ error(msg: string, ...args: any[]): void;
63
+ };
64
+ }
65
+ export declare class MultiManager {
66
+ private static instance;
67
+ private managers;
68
+ private logger;
69
+ private constructor();
70
+ /**
71
+ * Get or create the singleton MultiManager instance.
72
+ */
73
+ static getInstance(options: MultiManagerOptions): Result<MultiManager>;
74
+ /**
75
+ * Reset the singleton (primarily for testing).
76
+ */
77
+ static reset(): void;
78
+ /**
79
+ * Execute a function with a specific provider's key pool.
80
+ *
81
+ * @param fn - The function to execute with a key
82
+ * @param options - Must include `provider` to select the pool
83
+ */
84
+ execute<T>(fn: (key: string, signal?: AbortSignal) => Promise<T>, options: ExecuteOptions & {
85
+ prompt?: string;
86
+ provider: string;
87
+ }): Promise<T>;
88
+ /**
89
+ * Execute a streaming function with a specific provider's key pool.
90
+ */
91
+ executeStream<T>(fn: (key: string, signal?: AbortSignal) => AsyncGenerator<T, any, unknown>, options: ExecuteOptions & {
92
+ prompt?: string;
93
+ provider: string;
94
+ }): AsyncGenerator<T, any, unknown>;
95
+ /**
96
+ * Get a raw key from a specific provider pool.
97
+ */
98
+ getKey(provider: string): string | null;
99
+ /**
100
+ * Get stats for a specific provider.
101
+ */
102
+ getStats(provider: string): ApiKeyManagerStats | null;
103
+ /**
104
+ * Get aggregate stats across ALL providers.
105
+ */
106
+ getMultiStats(): Record<string, ApiKeyManagerStats>;
107
+ /**
108
+ * Get the list of available provider names.
109
+ */
110
+ getProviders(): string[];
111
+ /**
112
+ * Get the underlying ApiKeyManager for a specific provider.
113
+ */
114
+ getManager(provider: string): ApiKeyManager | undefined;
115
+ /**
116
+ * Stop all health checks and clean up.
117
+ */
118
+ destroy(): void;
119
+ private static parseKeysFromEnv;
120
+ }
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * MultiManager Preset — Multi-Provider Key Vault
4
+ *
5
+ * Manages API keys across multiple providers from a single entry point.
6
+ * Aggregates keys from multiple environment variables and routes
7
+ * requests to the correct provider pool.
8
+ *
9
+ * @module presets/multi
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { MultiManager } from '@splashcodex/api-key-manager/presets/multi';
14
+ *
15
+ * const result = MultiManager.getInstance({
16
+ * providers: {
17
+ * gemini: { envKeys: ['GOOGLE_GEMINI_API_KEY'] },
18
+ * openai: { envKeys: ['OPENAI_API_KEY'] },
19
+ * }
20
+ * });
21
+ *
22
+ * if (result.success) {
23
+ * const vault = result.data;
24
+ *
25
+ * // Route to specific provider
26
+ * const text = await vault.execute(async (key) => {
27
+ * // key is from the gemini pool
28
+ * return callGemini(key, prompt);
29
+ * }, { provider: 'gemini', maxRetries: 3 });
30
+ *
31
+ * // Get stats across all providers
32
+ * const stats = vault.getMultiStats();
33
+ * }
34
+ * ```
35
+ */
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.MultiManager = void 0;
38
+ const index_1 = require("../index");
39
+ const file_1 = require("../persistence/file");
40
+ const path_1 = require("path");
41
+ const os_1 = require("os");
42
+ // ─── MultiManager ───────────────────────────────────────────────────────────
43
+ class MultiManager {
44
+ static instance = null;
45
+ managers = new Map();
46
+ logger;
47
+ constructor(options) {
48
+ this.logger = options.logger || console;
49
+ for (const [providerName, config] of Object.entries(options.providers)) {
50
+ const keys = MultiManager.parseKeysFromEnv(config.envKeys);
51
+ if (keys.length === 0) {
52
+ this.logger.warn(`[MultiManager:${providerName}] No API keys found in: ${config.envKeys.join(', ')}`);
53
+ }
54
+ const storage = new file_1.FileStorage({
55
+ filePath: (0, path_1.join)((0, os_1.tmpdir)(), `codedex_multi_${providerName}_state.json`),
56
+ clearOnInit: true,
57
+ });
58
+ const manager = new index_1.ApiKeyManager(keys, {
59
+ storage,
60
+ strategy: config.strategy || new index_1.LatencyStrategy(),
61
+ concurrency: config.concurrency ?? 20,
62
+ semanticCache: config.semanticCache,
63
+ });
64
+ // Wire events
65
+ manager.on('keyDead', (key) => this.logger.error(`[MultiManager:${providerName}] Key DEAD: ...${key.slice(-4)}`));
66
+ manager.on('circuitOpen', (key) => this.logger.warn(`[MultiManager:${providerName}] Circuit OPEN: ...${key.slice(-4)}`));
67
+ manager.on('keyRecovered', (key) => this.logger.info(`[MultiManager:${providerName}] Key RECOVERED: ...${key.slice(-4)}`));
68
+ manager.on('allKeysExhausted', () => this.logger.error(`[MultiManager:${providerName}] ALL KEYS EXHAUSTED`));
69
+ // Health checks
70
+ const interval = options.healthCheckIntervalMs ?? 300_000;
71
+ if (interval > 0) {
72
+ manager.startHealthChecks(interval);
73
+ }
74
+ this.managers.set(providerName, manager);
75
+ this.logger.info(`[MultiManager:${providerName}] Initialized with ${keys.length} keys`);
76
+ }
77
+ }
78
+ // ─── Factory ────────────────────────────────────────────────────────────
79
+ /**
80
+ * Get or create the singleton MultiManager instance.
81
+ */
82
+ static getInstance(options) {
83
+ if (MultiManager.instance) {
84
+ return { success: true, data: MultiManager.instance };
85
+ }
86
+ try {
87
+ MultiManager.instance = new MultiManager(options);
88
+ return { success: true, data: MultiManager.instance };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ success: false,
93
+ error: error instanceof Error ? error : new Error(String(error)),
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * Reset the singleton (primarily for testing).
99
+ */
100
+ static reset() {
101
+ if (MultiManager.instance) {
102
+ MultiManager.instance.destroy();
103
+ MultiManager.instance = null;
104
+ }
105
+ }
106
+ // ─── Public API ─────────────────────────────────────────────────────────
107
+ /**
108
+ * Execute a function with a specific provider's key pool.
109
+ *
110
+ * @param fn - The function to execute with a key
111
+ * @param options - Must include `provider` to select the pool
112
+ */
113
+ async execute(fn, options) {
114
+ const manager = this.managers.get(options.provider);
115
+ if (!manager) {
116
+ throw new Error(`[MultiManager] Unknown provider "${options.provider}". ` +
117
+ `Available: ${[...this.managers.keys()].join(', ')}`);
118
+ }
119
+ // Strip `provider` before delegating — each manager only has keys for one provider
120
+ const { provider, ...delegateOptions } = options;
121
+ return manager.execute(fn, delegateOptions);
122
+ }
123
+ /**
124
+ * Execute a streaming function with a specific provider's key pool.
125
+ */
126
+ async *executeStream(fn, options) {
127
+ const manager = this.managers.get(options.provider);
128
+ if (!manager) {
129
+ throw new Error(`[MultiManager] Unknown provider "${options.provider}". ` +
130
+ `Available: ${[...this.managers.keys()].join(', ')}`);
131
+ }
132
+ const { provider, ...delegateOptions } = options;
133
+ yield* manager.executeStream(fn, delegateOptions);
134
+ }
135
+ /**
136
+ * Get a raw key from a specific provider pool.
137
+ */
138
+ getKey(provider) {
139
+ const manager = this.managers.get(provider);
140
+ if (!manager)
141
+ return null;
142
+ return manager.getKey();
143
+ }
144
+ /**
145
+ * Get stats for a specific provider.
146
+ */
147
+ getStats(provider) {
148
+ const manager = this.managers.get(provider);
149
+ if (!manager)
150
+ return null;
151
+ return manager.getStats();
152
+ }
153
+ /**
154
+ * Get aggregate stats across ALL providers.
155
+ */
156
+ getMultiStats() {
157
+ const stats = {};
158
+ for (const [name, manager] of this.managers) {
159
+ stats[name] = manager.getStats();
160
+ }
161
+ return stats;
162
+ }
163
+ /**
164
+ * Get the list of available provider names.
165
+ */
166
+ getProviders() {
167
+ return [...this.managers.keys()];
168
+ }
169
+ /**
170
+ * Get the underlying ApiKeyManager for a specific provider.
171
+ */
172
+ getManager(provider) {
173
+ return this.managers.get(provider);
174
+ }
175
+ /**
176
+ * Stop all health checks and clean up.
177
+ */
178
+ destroy() {
179
+ for (const [, manager] of this.managers) {
180
+ manager.stopHealthChecks();
181
+ }
182
+ this.managers.clear();
183
+ }
184
+ // ─── Helpers ────────────────────────────────────────────────────────────
185
+ static parseKeysFromEnv(envKeys) {
186
+ const keys = [];
187
+ for (const envName of envKeys) {
188
+ const envValue = process.env[envName];
189
+ if (!envValue)
190
+ continue;
191
+ const trimmed = envValue.trim();
192
+ if (!trimmed)
193
+ continue;
194
+ if (trimmed.startsWith('[')) {
195
+ try {
196
+ const parsed = JSON.parse(trimmed);
197
+ if (Array.isArray(parsed)) {
198
+ keys.push(...parsed.filter((k) => typeof k === 'string' && k.trim()));
199
+ continue;
200
+ }
201
+ }
202
+ catch { /* not JSON */ }
203
+ }
204
+ keys.push(...trimmed.split(',').map(k => k.trim()).filter(k => k.length > 0));
205
+ }
206
+ return [...new Set(keys)];
207
+ }
208
+ }
209
+ exports.MultiManager = MultiManager;
210
+ //# sourceMappingURL=multi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi.js","sourceRoot":"","sources":["../../src/presets/multi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * OpenAI Preset — One-line OpenAI API key management
3
+ *
4
+ * Pre-configured singleton with:
5
+ * - Reads `OPENAI_API_KEY` from env
6
+ * - LatencyStrategy for optimal key selection
7
+ * - File persistence (survives restarts)
8
+ * - Health checks every 5 minutes
9
+ * - Concurrency limit of 20
10
+ *
11
+ * @module presets/openai
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { OpenAIManager } from '@splashcodex/api-key-manager/presets/openai';
16
+ *
17
+ * const result = OpenAIManager.getInstance();
18
+ * if (!result.success) throw result.error;
19
+ * const openai = result.data;
20
+ *
21
+ * const response = await openai.execute(async (key) => {
22
+ * const client = new OpenAI({ apiKey: key });
23
+ * const completion = await client.chat.completions.create({
24
+ * model: 'gpt-4o',
25
+ * messages: [{ role: 'user', content: 'Hello!' }],
26
+ * });
27
+ * return completion.choices[0].message.content;
28
+ * }, { maxRetries: 3, timeoutMs: 30000 });
29
+ * ```
30
+ */
31
+ import { BasePreset, PresetOptions, Result } from './base';
32
+ export declare class OpenAIManager extends BasePreset {
33
+ private static readonly PROVIDER;
34
+ private constructor();
35
+ private static getDefaultOptions;
36
+ /**
37
+ * Get or create the singleton OpenAIManager instance.
38
+ *
39
+ * @param overrides - Optional configuration overrides
40
+ * @returns Result<OpenAIManager>
41
+ */
42
+ static getInstance(overrides?: Partial<PresetOptions>): Result<OpenAIManager>;
43
+ static reset(): void;
44
+ }
45
+ export { Result } from './base';
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI Preset — One-line OpenAI API key management
4
+ *
5
+ * Pre-configured singleton with:
6
+ * - Reads `OPENAI_API_KEY` from env
7
+ * - LatencyStrategy for optimal key selection
8
+ * - File persistence (survives restarts)
9
+ * - Health checks every 5 minutes
10
+ * - Concurrency limit of 20
11
+ *
12
+ * @module presets/openai
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { OpenAIManager } from '@splashcodex/api-key-manager/presets/openai';
17
+ *
18
+ * const result = OpenAIManager.getInstance();
19
+ * if (!result.success) throw result.error;
20
+ * const openai = result.data;
21
+ *
22
+ * const response = await openai.execute(async (key) => {
23
+ * const client = new OpenAI({ apiKey: key });
24
+ * const completion = await client.chat.completions.create({
25
+ * model: 'gpt-4o',
26
+ * messages: [{ role: 'user', content: 'Hello!' }],
27
+ * });
28
+ * return completion.choices[0].message.content;
29
+ * }, { maxRetries: 3, timeoutMs: 30000 });
30
+ * ```
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.OpenAIManager = void 0;
34
+ const base_1 = require("./base");
35
+ class OpenAIManager extends base_1.BasePreset {
36
+ static PROVIDER = 'openai';
37
+ constructor(keys, options) {
38
+ super(keys, options);
39
+ }
40
+ static getDefaultOptions() {
41
+ return {
42
+ envKeys: ['OPENAI_API_KEY'],
43
+ provider: OpenAIManager.PROVIDER,
44
+ concurrency: 20,
45
+ healthCheckIntervalMs: 300_000,
46
+ };
47
+ }
48
+ /**
49
+ * Get or create the singleton OpenAIManager instance.
50
+ *
51
+ * @param overrides - Optional configuration overrides
52
+ * @returns Result<OpenAIManager>
53
+ */
54
+ static getInstance(overrides) {
55
+ return base_1.BasePreset.createInstance(OpenAIManager, OpenAIManager.getDefaultOptions(), overrides);
56
+ }
57
+ static reset() {
58
+ base_1.BasePreset.resetInstance(OpenAIManager.PROVIDER);
59
+ }
60
+ }
61
+ exports.OpenAIManager = OpenAIManager;
62
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/presets/openai.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAEH,iCAA2D;AAE3D,MAAa,aAAc,SAAQ,iBAAU;IACjC,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC;IAE5C,YAAoB,IAAc,EAAE,OAAsB;QACtD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC;IAEO,MAAM,CAAC,iBAAiB;QAC5B,OAAO;YACH,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,WAAW,EAAE,EAAE;YACf,qBAAqB,EAAE,OAAO;SACjC,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,SAAkC;QACjD,OAAO,iBAAU,CAAC,cAAc,CAC5B,aAAyF,EACzF,aAAa,CAAC,iBAAiB,EAAE,EACjC,SAAS,CACa,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAK;QACR,iBAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;;AAhCL,sCAiCC"}
package/package.json CHANGED
@@ -1,9 +1,75 @@
1
1
  {
2
2
  "name": "@splashcodex/api-key-manager",
3
- "version": "4.1.0",
4
- "description": "Universal API Key Rotation System for rate-limited APIs",
3
+ "version": "5.0.0",
4
+ "description": "Universal API Key Management Gateway with provider presets, persistence, and multi-provider vault",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "require": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ },
12
+ "./presets": {
13
+ "require": "./dist/presets/index.js",
14
+ "types": "./dist/presets/index.d.ts"
15
+ },
16
+ "./presets/gemini": {
17
+ "require": "./dist/presets/gemini.js",
18
+ "types": "./dist/presets/gemini.d.ts"
19
+ },
20
+ "./presets/openai": {
21
+ "require": "./dist/presets/openai.js",
22
+ "types": "./dist/presets/openai.d.ts"
23
+ },
24
+ "./presets/multi": {
25
+ "require": "./dist/presets/multi.js",
26
+ "types": "./dist/presets/multi.d.ts"
27
+ },
28
+ "./presets/base": {
29
+ "require": "./dist/presets/base.js",
30
+ "types": "./dist/presets/base.d.ts"
31
+ },
32
+ "./persistence": {
33
+ "require": "./dist/persistence/index.js",
34
+ "types": "./dist/persistence/index.d.ts"
35
+ },
36
+ "./persistence/file": {
37
+ "require": "./dist/persistence/file.js",
38
+ "types": "./dist/persistence/file.d.ts"
39
+ },
40
+ "./persistence/memory": {
41
+ "require": "./dist/persistence/memory.js",
42
+ "types": "./dist/persistence/memory.d.ts"
43
+ }
44
+ },
45
+ "typesVersions": {
46
+ "*": {
47
+ "presets": [
48
+ "dist/presets/index.d.ts"
49
+ ],
50
+ "presets/gemini": [
51
+ "dist/presets/gemini.d.ts"
52
+ ],
53
+ "presets/openai": [
54
+ "dist/presets/openai.d.ts"
55
+ ],
56
+ "presets/multi": [
57
+ "dist/presets/multi.d.ts"
58
+ ],
59
+ "presets/base": [
60
+ "dist/presets/base.d.ts"
61
+ ],
62
+ "persistence": [
63
+ "dist/persistence/index.d.ts"
64
+ ],
65
+ "persistence/file": [
66
+ "dist/persistence/file.d.ts"
67
+ ],
68
+ "persistence/memory": [
69
+ "dist/persistence/memory.d.ts"
70
+ ]
71
+ }
72
+ },
7
73
  "files": [
8
74
  "dist",
9
75
  "src"
@@ -18,6 +84,7 @@
18
84
  "key",
19
85
  "rotation",
20
86
  "gemini",
87
+ "openai",
21
88
  "rate-limit",
22
89
  "circuit-breaker",
23
90
  "resilience",
@@ -25,7 +92,12 @@
25
92
  "timeout",
26
93
  "retry",
27
94
  "gateway",
28
- "load-balancing"
95
+ "load-balancing",
96
+ "preset",
97
+ "persistence",
98
+ "multi-provider",
99
+ "semantic-cache",
100
+ "streaming"
29
101
  ],
30
102
  "author": "Antigravity",
31
103
  "license": "ISC",